[gulp]

2014-04-09 3 views
16

jsFiles 개체를 기반으로 작업 (축소 및 연결)을 동적으로 만들려고합니다. 키는 대상 파일 이름을 제공하고 배열은 src 파일을 포함합니다. 내가 꿀꺽 꿀꺽 실행할 때 모든 작업 이름이 실행되는 것을 볼 수 있지만이 경우 group2.js 인 마지막 키만 씁니다. 여기 뭐가 잘못 됐니? jslinterrors.com/dont-make-functions-within-a-loop에 기초[gulp]

// imports here 

var jsFiles = 
{ 
    group1:[file1.js,file2.js], 
    group2:[file2.js,file3.js] 
}; 

for (var key in jsFiles) 
{ 
    gulp.task(key, function() { 
     return gulp.src(jsFiles[key]) 
     .pipe(jshint()) 
     .pipe(uglify()) 
     .pipe(concat(key + '.js')) // <- HERE 
     .pipe(gulp.dest('public/js')); 
    }); 
} 

var defaultTasks = []; 
for (var key in jsFiles) 
{ 
    defaultTasks.push(key); 
} 
gulp.task('default', defaultTasks); 

답변

0

해결책 :

var jsFiles = 
{ 
    group1:[file1.js,file2.js], 
    group2:[file2.js,file3.js] 
}; 

function createTask(key) 
{ 
    return gulp.src(jsFiles[key]) 
     .pipe(jshint()) 
     .pipe(uglify()) 
     .pipe(concat(key + '.js')) 
     .pipe(gulp.dest('public/js')); 

} 

for (var key in jsFiles) 
{ 
    createTask(key); 
} 

var defaultTasks = []; 
for (var key in jsFiles) 
{ 
    defaultTasks.push(key); 
} 
gulp.task('default', defaultTasks); 
+0

이 솔루션은 저에게 적합하지 않았습니다. createTask (key)로는 충분하지 않습니다. gulp.task (key)를 명시 적으로 호출하지 않으면 gulp가 기본 작업을 수행 할 때 해당 작업을 찾을 수 없습니다. 나는 oaleynik의 대답을 사용하여 끝났다. – Chris

+0

어떻게 모든 작업을 비동기로 실행할 수 있습니까? –

6

캡처 인생을 사용하여 각각의 반복에 '키'변수의 값. 예제에서, concat 호출 순간에 루프는 이미 완료되고 변수 키는 마지막 값을 갖습니다. 자세한 설명

for (var key in jsFiles) 
{ 
    (function(key) { 
     gulp.task(key, function() { 
      return gulp.src(jsFiles[key]) 
       .pipe(jshint()) 
       .pipe(uglify()) 
       .pipe(concat(key + '.js')) // <- HERE 
       .pipe(gulp.dest('public/js')); 
     }); 

    })(key); 

} 

볼이 function closures -

+2

이 방법은 효과가 있지만 lint는 루프 내부에서 함수를 작성하는 것에 대해 경고합니다. – cmancre

+0

@cmancre separated function은 ref로 함수에 보내질 key param과 함께 루프에서 선언되고 호출 될 수 있습니다. 현재 질문에 대한 대답은 반복 변수를 캡처하는 것입니다. 질문에서 성공한 linting에 대한 요구 사항은 언급하지 않았습니다. ( – oaleynik

21

또 다른 옵션은, Object.keys와 함께 기능 배열 반복 기능을 사용할과 같이하는 것입니다 참조 문제 섹션 방지 :

var defaultTasks = Object.keys(jsFiles); 

defaultTasks.forEach(function(taskName) { 
    gulp.task(taskName, function() { 
     return gulp.src(jsFiles[taskName]) 
      .pipe(jshint()) 
      .pipe(uglify()) 
      .pipe(concat(key + '.js')) 
      .pipe(gulp.dest('public/js')); 
    }); 
}); 

나는이 느낌을 루프와 함수가 같은 장소에 있기 때문에 조금 더 깨끗합니다. 따라서 유지 관리가 더 쉽습니다. 여기

+0

다음 Gulp 4를 사용하면 다음 작업을 병렬로 호출 할 수 있습니다 : gulp.parallel ("scripts : app", "scripts : vendor")!^ –

+0

하지만 어떻게하면 50 개의 분리 된 작업을 처리 할 수 ​​있습니까? 모두 동일한 방식으로 작업해야 gulp.parallel을 계속 사용할 수 있습니까? – AKFourSeven

0

cmancre 솔루션 작업을 잘 ...하지만 수정과 내가 현재 사용하고 하나를 작업 :

var jsFiles = 
{ 
    group1:[file1.js,file2.js], 
    group2:[file2.js,file3.js] 
}; 

var defaultTasks = []; 

function createTask(key) 
{ 
    gulp.task(key, function() { 
     return gulp.src(jsFiles[key]) 
      .pipe(uglify()) 
      .pipe(concat(key + '.js')) 
      .pipe(rename({suffix: ".min"})) //Will create group1.min.js 
      .pipe(gulp.dest('./assets/js')); 
    }); 
} 

for (var key in jsFiles) 
{ 
    createTask(key); 
    defaultTasks.push(key); 
} 

gulp.task('default', defaultTasks, function(){ 
    for (var key in jsFiles) 
    { 
     //Will watch each js defined in group1 or group2 
     gulp.watch(jsFiles[key], [key]) 
    } 
}); 
1

을 꿀꺽 # 4.0을 사용하여, 나는 같은 gulp.parallel()의 사용을 좋아한다 :

var plugins = require('gulp-load-plugins'); 
var $ = plugins(); 

var jsFiles = { 
    // Libraries required by Foundation 
    "jquery" : [ 
     "bower_components/jquery/dist/jquery.js", 
     "bower_components/motion-ui/dist/motion-ui.js", 
     "bower_components/what-input/dist/what-input.js" 
    ], 
    "angular" : [ 
     "bower_components/angular/angular.min.js", 
     "bower_components/angular-animate/angular-animate.min.js", 
     "bower_components/angular-aria/angular-aria.min.js", 
     "bower_components/angular-material/angular-material.min.js", 
     "bower_components/angular-messages/angular-messages.min.js", 
     "bower_components/angular-sanitize/angular-sanitize.min.js", 
     "bower_components/angular-ui-i18n/angular-ui-i18n.min.js" 
    ], 
    // Core Foundation files 
    "foundation-sites" : [ 
     "bower_components/foundation-sites/dist/js/foundation.js" 
    ], 
    // Dropzone Library 
    "dropzone" : [ 
     "bower_components/dropzone/dist/dropzone.js", 
     "bower_components/ng-dropzone/dist/ng-dropzone.min.js" 
    ] 
}; 

var defaultTasks = Object.keys(jsFiles); 

defaultTasks.forEach(function (libName) { 
    gulp.task('scripts:'+libName, function() { 
     return gulp.src(jsFiles[libName]) 
     //.pipe($.jshint()) // if you want it 
     //.pipe($.uglify()) // if you like it 
     //.pipe($.concat(libName+'.js')) // .min.js if you Uglified it 
     .pipe(gulp.dest('dist/lib/'+libName)); 
    }); 
}); 

gulp.task('bundle_javascript_dependencies', 
    gulp.parallel(
     defaultTasks.map(function(name) { return 'scripts:'+name; }) 
    ) 
); 

gulp.task('build', 
    gulp.series(
     'clean', 
     gulp.parallel(/* Any other task of function */ 'bundle_javascript_dependencies') 
    ) 
); 

나를 위해 일하는 것이 좋습니다. OverZealous에게 감사의 말을 전합니다.