Grunt.js 복사를 사용하여 디렉토리의 모든 파일을 다른 디렉토리로 복사하십시오.


91

빌드 프로세스의 일부로 디렉터리의 모든 파일을 다른 디렉터리로 복사하려고합니다. 내가 명시 적으로 지정한 개별 파일에 대해 잘 작동하지만 전체 디렉토리를 복사하려고 할 때 전체 디렉토리 구조를 복사하거나 전혀 복사하지 않는 것과 같은 이상한 작업을 수행합니다. 내 GruntFile.js의 관련 부분은 다음과 같습니다.

copy: {
  myvoice: {
    files: [
      { src:"src/html/index.html", dest:"dist/myvoice/index.html" },
      { src:"src/html/css/style.css", dest:"dist/myvoice/css/style.css" },
      { src:"src/html/js/require.js", dest:"dist/myvoice/js/require.js" },
      { src:"build/myvoice/main.js", dest:"dist/myvoice/js/main.js" },
      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }
    ]
  }
},

특히 내가 작업 할 수없는 마지막 줄입니다.

      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }

답변:


149

이 답변flatten: true옵션은 경우에 따라 작동 할 수 있지만 더 일반적인 요구 사항은 폴더와 하위 폴더 구조를 그대로 복사하는 것 입니다. 대부분의 경우 하위 폴더가 있으면 코드에서 그런 방식으로 참조되는 것 같습니다. 이 작업의 핵심 은 지정된 작업 디렉토리에 상대적인 폴더 구조를 유지 하는 옵션입니다.destcwd

copy: {
  files: {
    cwd: 'path/to/files',  // set working folder / root to copy
    src: '**/*',           // copy all files and subfolders
    dest: 'dist/files',    // destination folder
    expand: true           // required when using cwd
  }
}

고마워요-당신이 맞아요이 대답은 제가 질문했을 때 제가 찾고 있던 것보다 더 많습니다. 나는 이전 답변으로 인한 평탄화를 처리하는 법을 배웠지 만 성가신 일이었습니다.
Evan Hobbs

13
이 때문에 한 시간 넘게졌습니다 ... cwd옵션 을 사용하는 경우 반드시을 (를) 설정하십시오 expand:true. 을 설정하지 않으면 expand:truecwd가 제대로 작동하지 않습니다.
ducin

2
디렉토리 경로가 '/'로 끝나는 지 확인 flatten: false하고이 작업을 수행하기 위해 추가 해야했습니다.
Samuel Rossille 2014-08-31

**/* 그게 내가 찾고 있던 ** 고마워요.
Sam

43

이 작업은 파일 glob을 지정하는 경우 폴더 구조를 유지합니다. 원하는 것은 flatten구조를 제거하는 옵션입니다.

{
    expand: true,
    flatten: true,
    src: ['src/html/css/fonts/**'],
    dest: 'dist/myvoice/css/fonts/',
    filter: 'isFile'
}

Github repo 에서 사용 가능한 나머지 옵션을 찾으십시오 . 도움이 되었기를 바랍니다.


24

나는의 형식 변화하는 것을 추가하고 싶습니다 글로브을SRC하는 복사의 작동 방식을 수정합니다.

가리키는 OUT으로 bmoeskau 위, 다음이 복사됩니다 모든 것을 내부 dist/와로 이동 path/to/dir(이미 존재하는 경우 대상을 덮어 쓰기).

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '**'
  }
}

그러나 다음 사항에 유의하십시오.

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*'
  }
}

dist/디렉토리뿐만 아니라 내부의 파일 만 복사 하지만 해당 디렉토리의 내용을 대상으로 복사 하지는 않습니다 .

또한 다음 src: '*/*'은 .NET 내부의 내용이있는 디렉토리 복사 dist/합니다. 즉, 내부 파일은 dist/복사되지 않습니다.

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*'
  }
}

마지막으로, 위와 동일하지만 src: '**/**'복사됩니다 만하는 것은 내부의 파일 dist/뿐만 아니라 내부의 파일 dist/을 하위 디렉토리 path/to/dir. 따라서 대상 내부에는 폴더가 없습니다.

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*',
    flatten: true,
    filter: 'isFile'
  }
}

4
훌륭한 설명! +1
myrocode 2014 년

3
GitHub의에, 내가 예와 같은 문서보다 더
wukong

+1 별의 수가 의미하는 바에 대한 규칙이 있습니까? 예를 들어 **항상 파일과 디렉토리를 의미하고 파일 *만 의미 합니까?
CodyBugstein 2015 년

1
@Imray bash 매뉴얼에서 : *단일 패턴으로 사용되는 두 개의 인접한 s는 모든 파일 과 0 개 이상의 디렉토리 및 하위 디렉토리와 일치 합니다 . 뒤에 a가 있으면 /인접한 두 개의 *디렉토리 및 하위 디렉토리와 만 일치 합니다 .
Jorge Bucaran 2015 년

1
**모든 항목 과 일치 하지만 디렉토리 및 하위 디렉토리 (파일 아님) **/ 일치 합니다.
Jorge Bucaran 2015 년

1

(Coffeescript에서) 파일 세그먼트에 중괄호 대신 egdy를 사용해야했습니다 ...

copy: {
  files: [
    cwd: 'path/to/files'
    src: '**/*'
    dest: 'dist/files'
    expand: true
  ]
}

0

앵귤러 여만으로 개발하고 있다면, 이것이 grunt로 복사하는 더 좋은 방법입니다. expand : cwd를 사용할 때 true가 필요합니다. <% = yeoman.app %>는 앱 경로 ( '.')입니다.

 {
    expand: true,
     cwd: '<%= yeoman.app %>/data',
     dest: '<%= yeoman.dist %>/data',
     src: ['**']
    }

이 코드 스 니펫은 질문을 해결할 수 있지만 설명을 포함하면 게시물의 품질을 개선하는 데 실제로 도움이됩니다. 미래에 독자를 위해 질문에 답하고 있으며 해당 사용자는 코드 제안 이유를 모를 수 있습니다. 또한 코드와 설명의 가독성을 떨어 뜨리므로 설명 주석으로 코드를 혼잡하게 만들지 마십시오!
안녕 StackExchange
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.