2014-12-02 21 views
18

Tôi đang cố gắng điều kiện một luồng tệp dựa trên giá trị của một biến, như một cách để xác định hai môi trường xây dựng riêng biệt (ví dụ: phát triển và sản xuất).Có thể gán một biến trong tác vụ gulp trước khi chạy các phụ thuộc không?

Một số nhiệm vụ có thể chạy độc lập với một lá cờ dòng lệnh như sau: gulp scripts --env production

Và sau đó sẽ thực hiện một số bước đường ống dẫn sản xuất chỉ:

gulp.task('scripts', function() { 
    var jsFilter = filter(['*.js']), 
    appFiles; 

    return gulp.src(appFiles) 
    .pipe(jsFilter) 
    .pipe(concat('application-build.js')) 
    .pipe(gulpif(env === 'production', uglify())) 
    .pipe(size()) 
    .pipe(gulpif(env === 'production', gulp.dest('dist/js'), gulp.dest('tmp/js'))) 
    .pipe(browserSync.reload({ stream: true })); 
}); 

Tôi có một nhiệm vụ build mà các cuộc gọi một số nhiệm vụ khác làm phụ thuộc (ví dụ như tác vụ scripts). Tôi muốn nhiệm vụ build này chỉ định một biến (env, trong trường hợp này) trước phụ thuộc nhiệm vụ đang chạy. Điều này có nghĩa là:

gulp.task('build', ['scripts', 'styles', 'otherstuff'], function() { 
    env = 'production'; 
} 

không hoạt động, vì phụ thuộc được chạy trước phần thân của tác vụ.

Tôi hiện đang có nó thực hiện với gulp.start:

gulp.task('build', function() { 
    env = 'production'; 
    gulp.start('scripts'); 
}); 

But the .start method isn't actually part of gulp's public API - nó comes from Orchestrator - và không có ý định sẽ được sử dụng cho bất cứ điều gì. Ngoài ra, phương pháp tương đương gulp.run đã không được chấp nhận từ API một thời gian trước đây.

Vì vậy, tôi tự hỏi - liệu có cách nào khác tôi có thể gán một biến trong một tác vụ trước khi chạy các phụ thuộc của nó không?

(Hoặc có thể có một cách tốt hơn để thực hiện một cái gì đó giống như môi trường xây dựng trong ngụm?)

Trả lời

13

Bạn có thể tạo một nhiệm vụ đặc biệt để thiết lập môi trường và chạy nó trước các nhiệm vụ khác của bạn.

gulp.task('set-production', function() { 
    env = 'production'; 
}); 

// Doesn't quite work because tasks are run in parallel 
gulp.task('build', ['set-production', 'scripts', 'styles', 'otherstuff']); 

Vấn đề ở đây là nhiệm vụ của bạn sẽ chạy song song, nghĩa là nhiệm vụ set-production có thể chạy sau các tác vụ khác. Bạn có thể giải quyết vấn đề này với gói run-sequence.

var runSequence = require('run-sequence'); 
gulp.task('build', function(callback) { 
    runSequence('set-production', ['scripts', 'styles', 'otherstuff'], callback); 
}); 

này sẽ chạy nhiệm vụ set-production trước, sau đó chạy scripts, styles, và otherstuff nhiệm vụ song song.

+0

Cảm ơn! Tôi thích cách tiếp cận này tốt hơn rất nhiều. Câu hỏi nhanh - (Tôi biết điều này được sử dụng trong tài liệu 'run-sequence' nhưng) tại sao lại có một cuộc gọi lại ở cuối? – wisew

+0

Vì nhiệm vụ gulp là không đồng bộ, cuộc gọi lại cho phép gulp biết nhiệm vụ được thực hiện. Điều đó là cần thiết nếu nhiệm vụ được khai báo là sự phụ thuộc của một nhiệm vụ khác. –

+0

Chúng ta có cần nhiệm vụ 'set-production' không, chúng ta có thể đặt biến' env' trực tiếp trước khi chúng ta chạy chuỗi không? –

15

CÁCH QUYỀN

Tôi không đồng ý với @Justin. Xác định một biến môi trường với một nhiệm vụ là một hackjob của một ý tưởng. Điều này được thực hiện tốt hơn với gutil.env theo cách này.

gulp --env prod task 

gulp.task('myTask',() => { console.log(gutil.env.env) }) 

Bây giờ, từ thời điểm này, bạn có gulp.env.env.

Hoặc, cách khác bạn có thể làm như this example in this ticket.. giải quyết vấn đề này từ nhà phát triển Gulp, điều đầu tiên đề xuất sử dụng biến môi trường, nhưng cung cấp thành ngữ này.

function js(shouldMinify) { 
    return gulp.src('./js/*.js') 
     .pipe(concat('app.js')) 
     .pipe(gulpif(shouldMinify, uglify())) 
     .pipe(gulp.dest('js')); 
}); 

gulp.task('develop', function() { 
    shouldMinify = false; 
    return js(shouldMinify); 
}); 

gulp.task('build', function() { 
    shouldMinify = true; 
    return js(shouldMinify); 
}); 

Đó same developer (phated) luôn nói để sử dụng env ...

Chưa kể, bạn nên kiểm soát loại hình này của logic với các biến môi trường hoặc cờ dòng lệnh. - phated

Có lẽ, anh ấy đề cập đến việc sử dụng các gutil.noop() trong tài liệu gulp-util 's:

// gulp should be called like this : 
// $ gulp --type production 
gulp.task('scripts', function() { 
    gulp.src('src/**/*.js') 
    .pipe(concat('script.js')) 
    // LOOK BELOW: if we don't send to uglify, we push to noop stream. 
    .pipe(gutil.env.type === 'production' ? uglify() : gutil.noop()) 
    .pipe(gulp.dest('dist/')); 
}); 
+2

Điều này tốt hơn câu trả lời của tôi. Được upvote của tôi. Tuy nhiên, ví dụ của bạn là khó hiểu vì đối số 'shouldMinify' trong hàm' js' ghi đè biến toàn cục 'shouldMinify' và biến toàn cục không bao giờ được sử dụng. Bạn có thể cập nhật ví dụ của mình để xóa 'shouldMinify' toàn cầu không? –

+0

@JustinHoward nắm bắt tốt, bị xóa. Tôi đã sao chép nó từ vé trên git. –

Các vấn đề liên quan