2014-03-27 2 views
3

Gulp JS를 사용하기 시작했으며 정말 유용하다고 인정해야합니다.Gulp Zip을 사용하여 zip 파일을 압축하는 방법

수행해야 할 작업 중 하나는 폴더 모음을 개별 zip 파일로 압축하여 각 폴더마다 하나씩 압축 한 다음이 모든 압축 파일을 하나의 단일 zip 파일로 압축하는 것입니다. 내가 관리했습니다 꿀꺽 - 우편 번호를 사용하면 여기까지 얻을 수 있습니다 :

var modelFolders = [ 
     'ELFH_Check', 
     'ELFH_DDP', 
     'ELFH_Free' 
]; 

gulp.task('zipModels', function() { 

     for (var i = 0; i < modelFolders.length; i++) { 

      var model = modelFolders[i]; 

      gulp.src('**/*', {cwd: path.join(process.cwd(), '/built_templates/' + model) }) 
      .pipe(zip(model + '.zip')) 
      .pipe(gulp.dest('./built_templates')); 

     }; 

}); 

이 작동하고 ELFH_Check.zip, ELFH_DDP.zip 및 ELFH_Free.zip를 출력합니다. 그러나, 나는 다음 작업이 작업을 얻을 "Templates.zip"난 관리 적이 없다라는 하나 개의 zip 파일에이 zip 파일을 압축해야합니다

// zip up model files 
gulp.task('zipTemplate', ['zipModels'], function() { 

     gulp.src('*.zip', {cwd: path.join(process.cwd(), './built_templates/') }) 
       .pipe(zip('Templates_.zip')) 
       .pipe(gulp.dest('./built_templates')); 

}); 

사람이 알고 있나요이 가능하거나 어떤 경우 내가 잘못하고있어?

답변

6

나는 문제도보고, 어쨌든 cwd 옵션과 관련이있는 것으로 보인다. 나는 더 조사 할 것이다.

는 @OverZealous 코멘트 후, 나는 더 조사하고 두 가지 문제 발견

  1. 그가 말했듯이, 당신은 반환하여, 종속성 작업 (zipModels)이 끝날 때까지 기다려야 꿀꺽 힌트 필요 그것으로부터의 흐름. 스트림이 여러 개인 경우 event-stream.merge을 사용하여 번들 스트림을 반환 할 수 있습니다.

  2. 번들 zip이 작동하지 않는 이유는 cwd가 /built_templates/을 가리키며 두 번째 슬래시가 문제를 일으키기 때문입니다. 제대로 작동하려면 뒤에 슬래시를 제거해야하므로 path.join(process.cwd(), '/built_templates')이어야합니다.

중요

어쨌든, 당신은 임시 파일을 피해야한다. Gulp 철학은 IO를 피하기 위해 파이프를 사용하는 것입니다. 그 방향으로, 당신이하고 싶은 것은 중간 단계 dest 단계, merge 단계, zip을 잘라 최종 출력하는 것입니다. 그런

뭔가 : 폴더 (built_templates)의 이름으로

var es = require('event-stream'); 

var modelFolders = [ 
    'ELFH_Check', 
    'ELFH_DDP', 
    'ELFH_Free' 
]; 

gulp.task('zipModels', function() { 
    var zips = [], 
     modelZip; 

    for (var i = 0; i < modelFolders.length; i++) { 
     var model = modelFolders[i]; 

     modelZip = gulp.src('**/*', {cwd: path.join(process.cwd(), '/built_templates/' + model) }) 
      .pipe(zip(model + '.zip')); 

     // notice we removed the dest step and store the zip stream (still in memory) 
     zips.push(modelZip); 
    }; 

    // we finally merge them (the zips), zip them again, and output. 
    return es.merge.apply(null, zips) 
     .pipe(zip('templates.zip')) 
     .pipe(gulp.dest('./')); 
}); 

, 임시 건설 한 파일을 생성 할 다른 작업이 보인다. 가급적 이러한 것들도 원하지 않는 것이 좋습니다. 스트림을 직접 ZIP 스트림 (최종적으로는 번들 -zip 스트림)으로 파이프해야합니다. 그렇게함으로써, 당신은 간단한 스트림 흐름을 가지게됩니다. 하나의 디스크가 읽히고 마지막에 하나의 디스크가 쓰여지고 임시 파일은 없습니다.

다른 작업이 필요한 경우 gulp.dest 파이프 앞에있는 단계까지 스트림을 생성하는 기능을 고려하고이 기능을 모든 하위 작업에 사용하십시오.

또한 비동기 작업 by returning a stream, a promise or receiving a callback의 기능을 항상 힌트로 시도하고 작업의 끝을 알려주십시오.

+1

그는 zipModels 작업에서 스트림을 반환하지 않는다는 점을 제외하면 그의 솔루션이 효과가있었습니다. 그러나 임시 파일을 사용하지 않기 때문에 솔루션이 더 좋습니다. – OverZealous

+0

감사합니다. 위에서 제시 한 코드를 사용했고 실제로 잘 작동합니다. 또한 간단한 스트림을 사용하고 임시 파일 사용을 피하는 것에 대한 요점을 이해합니다. 불행히도 임시 파일을 사용하지 않아도 Gulp의 zip 프로세스는 32 초 걸리고 7 zip을 호출하는 배치 파일은 약 7-9 초 걸립니다. 내가 생각할 수있는 유일한 해결책은 내 gulp.js 파일에서 gulp-exec을 사용하여 대신 7 zip을 호출하는 것입니다. 나는 다른 제안에 열리다. – Robini

+0

기본 질문과 조금 다른 것 같아요. 다른 질문을 열어보십시오. 그러나 성능 향상을 원하면'exec'를 호출해야 할 수도 있습니다. 그 문제는 없습니다. 그래도 플러그인을 작성하고'gulp.src'에'{read : false}'를 전달하는 것을 고려해보십시오. 실제로 파일의 내용은 필요 없으므로 pat 만 사용하십시오. 가장 좋은 방법은 내용을 명령 줄 유틸리티로 파이프하는 것이지만 [zip 파일을 허용하지 않습니다] (http://sevenzip.sourceforge.jp/chm/cmdline/switches/stdin.htm), 7Zip. –

관련 문제