gulp로 디렉토리를 재귀 적으로 복사하는 방법은 무엇입니까?


167

작업 디렉토리에서 서버 (같은 기계)로 프로젝트를 준비하려고합니다. 다음 코드를 사용하십시오.

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));

모든 파일이 복사되는 것을 볼 수 있습니다. 그러나 그것은 dir 구조를 평평하게합니다-모든 디렉토리는 복사되지만 모든 파일은 루트에 배치됩니다/var/www

Gulp는 훌륭한 빌드 도구처럼 보이지만 항목을 복사하는 것은 간단한 과정이어야합니다?


9
이 질문을 읽는 새로운 시청자에게는 최상위 투표 답변이 디렉토리를 병합하지 않는 원래 질문 사양을 해결하는 데 효과적이지 않습니다. 디렉토리 내의 모든 파일 이 복사되는 것이 아니라 사람들이 겪는 문제를 해결 하므로 유용합니다!
M1ke

1
병합하지 않으면 'css', 'js'및 'src'디렉토리가 존재한다는 의미 /var/www/입니까? 시도해 볼 수 있습니다{css,js,src}/**/*
Jason Goemaat

glob 확장은 gulp 내에서 작동한다는 것을 알고 있지만 glob 확장은 기본적으로 실행 전에 목록으로 확장되도록 의도되어 있기 때문에 각 항목에 대해 목록의 개별 라인으로 다르게 작동하면 혼란 스러울 것입니다.
M1ke 12

답변:


319

다음은 폴더 구조를 병합하지 않고 작동합니다.

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));

'**/*'중요한 부분입니다. 그 표현은 강력한 파일 선택 도구 인 glob 입니다. 예를 들어 .js 파일 만 복사하려면 다음을 사용하십시오.'input/folder/**/*.js'


2
gulp.dest를 추가하는 것을 잊었다 고 생각합니다. 이어야한다.pipe(gulp.dest('output/folder'));
마태 복음 Sprankle에게

3
특정 파일 확장자로 어떻게이 작업을 수행합니까?
Chev

1
원본 파일 세트에 대한 예를 제공하기 위해 답변을 편집 할 수 있습니까? 이것이 어떻게 적합한 지 잘 모르겠지만 방법과 비교하여 어떻게 작동하는지 기뻐할 것 {base:"."}입니다.
M1ke

2
주의하는 것이 중요하다 base이 답변에 주어진 기본 "폴더"입니다. 다시 말해서, 글로브 패턴이 시작되는 곳에서베이스가 시작됩니다. 이것은 내 파일이 끝나는 위치를 이해하는 데 도움이 **/*되었으며 gulp.dest매개 변수에 in이 필요하지 않은 이유이기도합니다 . Gulp는 glob의 모든 것을 가져와 같은 구조의 dest 폴더에 넣습니다.
닐 먼로

3
이것은 묻는 질문에 완전히 대답하지는 않습니다. 재귀 적으로 올바르게 복사하는 방법에 대한 훌륭한 솔루션이지만 기본 디렉토리를 수정하는 방법에 대한 답변은 없습니다.
ty1824

173

완전한 디렉토리 구조를 복사 gulp하려면 gulp.src()메소드 의 기반이 제공되어야합니다 .

따라서 gulp.src( [ files ], { "base" : "." })위의 구조에서 모든 디렉토리를 재귀 적으로 복사하는 데 사용할 수 있습니다.

나처럼, 이것을 잊어 버릴 수 있다면 다음을 시도하십시오.

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};

1
"cwd"구성을 추가하여 현재 작업 디렉토리를 설정하십시오.
Skarllot

3
경우 base여전히 당신을 혼란, 한 번 봐 걸릴 stackoverflow.com/a/35848322/11912 을 설명하는 훌륭한 일을한다.
James Skemp

60

따라서 모든 경로가 동일한 기본 경로를 갖는 경우 기본 작업을 제공하는 솔루션이 작동합니다. 그러나 다른 기본 경로를 제공하려는 경우 여전히 작동하지 않습니다.

이 문제를 해결하는 한 가지 방법은 경로의 시작을 상대적으로 만드는 것입니다. 귀하의 경우 :

gulp.src([
    'index.php',
    '*css/**/*',
    '*js/**/*',
    '*src/**/*',
])
.pipe(gulp.dest('/var/www/'));

이것이 효과가있는 이유는 Gulp가베이스를 첫 번째 명시 적 청크의 끝으로 설정하기 때문입니다.

폴더 구조에 두 번 일치 할 수있는 특정 경로가 없는지 확인할 수있는 경우에만 작동합니다. 예를 randomjs/들어와 레벨이 같으면 js둘 다 일치하게됩니다.

이것이 최상위 gulp.src 함수의 일부로 이것을 포함시키는 것으로 밝혀진 유일한 방법입니다. 그러나 각 glob을 분리하여 플러그인을위한 기본 디렉토리를 지정할 수있는 플러그인 / 함수를 작성하는 것은 간단 할 것입니다.


여러 기본 경로로 시작 해야하는 것은 아마도 문제의 범위를 넘어서는 것이라고 생각합니다. 원래 질문에서 파일을 절대 경로로 옮기고 있었지만 문제는 여전히 발생했습니다.베이스를 지정하지 않으면 모든 글로브의 모든 파일이 기존 계층 구조를 따르지 않고 단일 디렉토리로 복사됩니다.
M1ke

2
@ M1ke 사실, 질문의 요점은 다양한 기본 경로를 지시하지 않았습니다. 그러나 당신은 언급 However it flattens the dir structure - all directories are copied but every file is placed in the root /var/www하고 이것이 실제로 당신의 질문을 찾은 방법입니다-나는 다른 기본 경로로 재귀 적으로 복사하는 방법에 대한 해결책을 찾고있었습니다. 기본적으로,이 솔루션은 최고의 스타가 아무것도 :) 일치하지 보장 할 수있는 한, 다중 기본 경로의 경우에도 기본베이스를 지정하지 않고 경우에 작동하지만
ty1824

6
이 답변은 예외적입니다. 예를 들어 임의의 시작점에서 경로를 복사하는 것을 구체적으로 처리합니다. src 'assets/subdir/*fonts/*'는 fonts dir을 복사 할 수 있습니다 .
Wtower

-4

폴더의 전체 내용을 다른 폴더에 재귀 적으로 복사하려면 gulp에서 다음 windows 명령을 실행할 수 있습니다.

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y

마지막 /y옵션은 덮어 쓰기 확인 메시지를 표시하지 않는 것입니다.

Linux에서는 gulp에서 다음 명령을 실행할 수 있습니다.

cp -R /path/to/srcfolder /path/to/destfolder

당신이 사용할 수있는 꿀꺽 - 임원 또는 꿀꺽 - 실행 꿀꺽에서 시스템 명령을 실행하는 플러그인.

관련된 링크들:

  1. xcopy 사용법

  2. 꿀꺽 꿀꺽꿀꺽 꿀꺽


7
셸로 돌아가는 문제는 압축 또는 분석 도구와 같은 스트림에서 다른 명령을 실행할 수 없다는 것입니다.
M1ke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.