Görevlerini farklı şekillerde yürütmesi için Gulp'e bir bayrak geçirmek mümkün mü?


369

Normalde Gulp görevlerinde şöyle görünür:

gulp.task('my-task', function() {
    return gulp.src(options.SCSS_SOURCE)
        .pipe(sass({style:'nested'}))
        .pipe(autoprefixer('last 10 version'))
        .pipe(concat('style.css'))
        .pipe(gulp.dest(options.SCSS_DEST));
});

Bir komut satırı bayrağını yutmaya geçirmek (bu bir görev değildir) ve buna göre görevleri koşullu olarak yürütmesini sağlamak mümkün müdür? Örneğin

$ gulp my-task -a 1

Sonra gulpfile.js dosyamda:

gulp.task('my-task', function() {
        if (a == 1) {
            var source = options.SCSS_SOURCE;
        } else {
            var source = options.OTHER_SOURCE;
        }
        return gulp.src(source)
            .pipe(sass({style:'nested'}))
            .pipe(autoprefixer('last 10 version'))
            .pipe(concat('style.css'))
            .pipe(gulp.dest(options.SCSS_DEST));
});

11
Düğümde çalıştığından, muhtemelen process.argvkomut satırı bağımsız değişkenlerine erişmek için kullanabilirsiniz .
zzzzBov

Yanıtlar:


528

Gulp bunun için herhangi bir fayda sunmaz, ancak birçok komut argüman ayrıştırıcısından birini kullanabilirsiniz. Sevdim yargs. Olmalı:

var argv = require('yargs').argv;

gulp.task('my-task', function() {
    return gulp.src(argv.a == 1 ? options.SCSS_SOURCE : options.OTHER_SOURCE)
        .pipe(sass({style:'nested'}))
        .pipe(autoprefixer('last 10 version'))
        .pipe(concat('style.css'))
        .pipe(gulp.dest(options.SCSS_DEST));
});

Ayrıca gulp-if, dev ile ürün oluşturma için çok yararlı olan akışı koşullu olarak borulamak için birleştirebilirsiniz :

var argv = require('yargs').argv,
    gulpif = require('gulp-if'),
    rename = require('gulp-rename'),
    uglify = require('gulp-uglify');

gulp.task('my-js-task', function() {
  gulp.src('src/**/*.js')
    .pipe(concat('out.js'))
    .pipe(gulpif(argv.production, uglify()))
    .pipe(gulpif(argv.production, rename({suffix: '.min'})))
    .pipe(gulp.dest('dist/'));
});

Ve gulp my-js-taskveya ile arayın gulp my-js-task --production.


45
Bu bir şekilde @ resmi gulp github, temel şeyler belirtilmelidir!
Max

2
Bu, videoda bunu iplikler olmadan nasıl elde edeceğiniz açıklanmaktadır: youtube.com/watch?v=gRzCAyNrPV8
plankguy

9
Merhaba @plankguy, video çok güzel. Teşekkürler. Herhangi bir lib olmadan ortam değişkenlerinin elle nasıl ayrıştırılacağını gösterir. Küçük bir fark, videonun ortam değişkenleri ile ilgili olması , yukarıdaki örnek ise komut satır argümanları ile ilgilidir , burada Yargs, değişkenlerin ayrıştırılmasını soyutlayarak tüketimi basitleştirmeye yardımcı olan başka bir araçtır.
Caio Cunha

12
Eğer kullanırsanız, npm run gulpo zaman böyle kullanmalısınız npm run gulp -- --production.
ivkremer

3
Bu resmi yeminli github'da (kelimenin tam anlamıyla) belirtilmiştir.
fracz

101

Düzenle

gulp-utilkullanımdan kaldırılmıştır ve bundan kaçınılmalıdır, bu nedenle daha önce kullanılmış olan minimist kullanılması önerilirgulp-util .

Bu yüzden gulpfile'mdaki bazı satırları kaldırmak için değiştirdim gulp-util:

var argv = require('minimist')(process.argv.slice(2));

gulp.task('styles', function() {
  return gulp.src(['src/styles/' + (argv.theme || 'main') + '.scss'])
    
});

orijinal

Projemde şu bayrağı kullanıyorum:

gulp styles --theme literature

Gulp bunun için bir nesne sunuyor gulp.env. Daha yeni sürümlerde kullanımdan kaldırıldı, bu yüzden gulp-util kullanmalısınız. Görevler şöyle görünür:

var util = require('gulp-util');

gulp.task('styles', function() {
  return gulp.src(['src/styles/' + (util.env.theme ? util.env.theme : 'main') + '.scss'])
    .pipe(compass({
        config_file: './config.rb',
        sass   : 'src/styles',
        css    : 'dist/styles',
        style  : 'expanded'

    }))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'ff 17', 'opera 12.1', 'ios 6', 'android 4'))
    .pipe(livereload(server))
    .pipe(gulp.dest('dist/styles'))
    .pipe(notify({ message: 'Styles task complete' }));
});

Ortam ayarı tüm alt görevler sırasında kullanılabilir. Bu bayrağı da saat görevinde de kullanabilirim:

gulp watch --theme literature

Ve stillerim de işe yarıyor.

Ciao Ralf


6
gulp.envkonsol günlüğü mesajında ​​çalışırken görebileceğiniz gibi kullanımdan kaldırılıyor . Sizden kendi ayrıştırıcınızı kullanmanızı ve yargsveya önermenizi isterler minimist.
Caio Cunha

2
İpucu için @CaioToOn teşekkürler. Cevabımı ve projemi de güncelledim;)
RWAM

4
Sen kısaltabilir util.env.theme ? util.env.theme : 'main'için util.env.theme || 'main'. Her neyse +1.
Renan

9
gulp-utilminimistkomut satırı bağımsız değişken ayrıştırması için kitaplığı kullanır . Bu nedenle gulp-util, bu amaç için fazladan bir kütüphaneye ihtiyacınız yoktur. Belge: github.com/substack/minimist
Rockallite

57

İşte bulduğum hızlı bir tarif:

gulpfile.js

var gulp   = require('gulp');

// npm install gulp yargs gulp-if gulp-uglify
var args   = require('yargs').argv;
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');

var isProduction = args.env === 'production';

gulp.task('scripts', function() {
  return gulp.src('**/*.js')
    .pipe(gulpif(isProduction, uglify())) // only minify if production
    .pipe(gulp.dest('dist'));
});

CLI

gulp scripts --env production

Orijinal Ref (artık mevcut değil): https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-params-from-cli.md

Minimist ile alternatif

Güncellenmiş Ref'den: https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-arguments-from-cli.md

gulpfile.js

// npm install --save-dev gulp gulp-if gulp-uglify minimist

var gulp = require('gulp');
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');

var minimist = require('minimist');

var knownOptions = {
  string: 'env',
  default: { env: process.env.NODE_ENV || 'production' }
};

var options = minimist(process.argv.slice(2), knownOptions);

gulp.task('scripts', function() {
  return gulp.src('**/*.js')
    .pipe(gulpif(options.env === 'production', uglify())) // only minify if production
    .pipe(gulp.dest('dist'));
});

CLI

gulp scripts --env production

2
Şu tarif bağlantısı gitmiş gibi görünüyor. Bunun yerine minimist paketi kullanan başka bir tane var: pass-arguments-from-cli.md . Bu yudum kendisi minimist kullandığından mantıklı .
yuvilio

39

on/offArgümanları ayrıştırmadan bayrak yapmanın çok basit bir yolu var . gulpfile.jsyalnızca diğerleri gibi yürütülen bir dosyadır, böylece şunları yapabilirsiniz:

var flags = {
  production: false
};

gulp.task('production', function () {
  flags.production = true;
});

Ve gulp-ifşartlı olarak bir adımı yürütmek gibi bir şey kullanın

gulp.task('build', function () {
  gulp.src('*.html')
    .pipe(gulp_if(flags.production, minify_html()))
    .pipe(gulp.dest('build/'));
});

Yürütme gulp buildhoş bir html üretirken gulp production build, simge durumuna küçülecektir.


2
Harika bir fikir, iplikler kullanarak kaydeder, bunu değişkenleri ayarlayan bir 'üretim öncesi' görevine sahip olarak genişlettim ve daha sonra 'üretim' ['inşa', 'üretim öncesi'] bağımlılık dizisine sahiptir. Bu şekilde 'yemin üretimi' yapabilirsiniz.
Keegan 82

Güzel! Akışı ayarlamadan önce bunu kullanıyorumgulp.task('mytask', function() { if (flags.myflag ) { flaggedtask } else { unflaggedask } });
henry

Sanırım bu bunu yapmak için yutkunmak yolu
gztomas

@ Keegan'shairstyle82 Benzer bir şey yaptım ama özelliklerini ayarlarken hiçbir yarış koşulu olmadığından emin olmak için koşu dizisi kullanmak zorunda kaldım flags.
CalMlynarczyk

3
Bu yöntemin dezavantajı, bayrak değişkenlerini her değiştirmek istediğinizde, yalnızca terminaldeki gulp komutuna argümanlar iletmek yerine gulpfile.js'yi değiştirmeniz gerektiğidir.
jbyrd

33

Bazı katı (sıralı!) Argümanlarınız varsa, bunları kontrol ederek alabilirsiniz process.argv.

var args = process.argv.slice(2);

if (args[0] === "--env" && args[1] === "production");

Onu çalıştır: gulp --env production

... Ancak, bunun ne olduğunu düşünüyorum tooo sıkı değil kurşun geçirmez! Yani, biraz uğraştım ... ve bu yardımcı fonksiyon ile sona erdi:

function getArg(key) {
  var index = process.argv.indexOf(key);
  var next = process.argv[index + 1];
  return (index < 0) ? null : (!next || next[0] === "-") ? true : next;
}

Bir argüman adı yiyor ve bunu içinde arayacak process.argv. Hiçbir şey bulunamazsa tükürür null. Aksi takdirde, bir sonraki argüman yoksa veya bir sonraki argüman bir komutsa ve bir değer değilse (tire ile farklılık gösteririz) truedöndürülür. (Çünkü anahtar var, ama sadece bir değeri yok). Önceki tüm durumlar başarısız olursa, bir sonraki argüman-değeri elde ettiğimiz şeydir.

> gulp watch --foo --bar 1337 -boom "Foo isn't equal to bar."

getArg("--foo") // => true
getArg("--bar") // => "1337"
getArg("-boom") // => "Foo isn't equal to bar."
getArg("--404") // => null

Tamam, şimdilik yeterli ... İşte yudum kullanarak basit bir örnek :

var gulp = require("gulp");
var sass = require("gulp-sass");
var rename = require("gulp-rename");

var env = getArg("--env");

gulp.task("styles", function () {
  return gulp.src("./index.scss")
  .pipe(sass({
    style: env === "production" ? "compressed" : "nested"
  }))
  .pipe(rename({
    extname: env === "production" ? ".min.css" : ".css"
  }))
  .pipe(gulp.dest("./build"));
});

Çalıştır gulp --env production


bağımsız değişken adının önüne tire (ler) if (args[0] === '--env' && args[1] === 'production');
eklenmelidir:,

@yckart - muhtemelen kod örneğinize getArg için gereksinimi ('..') eklemeniz gerekir.
jbyrd

7

Komut satırından görev geri aramasına parametre enjekte etmek için bir eklenti oluşturdum.

gulp.task('mytask', function (production) {
  console.log(production); // => true
});

// gulp mytask --production

https://github.com/stoeffel/gulp-param

Birisi bir hata bulursa veya bir iyileştirme yaparsa, PR'ları birleştirmekten mutlu olurum.


4

Eğer typescript ( gulpfile.ts) kullanıyorsanız bunu yapın yargs(@Caio Cunha'nın mükemmel cevabı üzerine inşa https://stackoverflow.com/a/23038290/1019307 ve yukarıdaki diğer yorumlar üzerine):

Yüklemek

npm install --save-dev yargs

typings install dt~yargs --global --save

.ts Dosyalar

Bunu .ts dosyalarına ekleyin:

import { argv } from 'yargs';

...

  let debug: boolean = argv.debug;

Bu, her bir .ts dosyasında ( tools/tasks/projectiçeri aktarılan dosyalar bile) ayrı ayrı yapılmalıdır gulpfile.ts/js.

Çalıştırmak

gulp build.dev --debug

Ya npmda argümanı yutmak için geçirin:

npm run build.dev -- --debug

2

Bağımsız değişkenleri komut satırından geçirme

// npm install --save-dev gulp gulp-if gulp-uglify minimist

var gulp = require('gulp');
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');

var minimist = require('minimist');

var knownOptions = {
  string: 'env',
  default: { env: process.env.NODE_ENV || 'production' }
};

var options = minimist(process.argv.slice(2), knownOptions);

gulp.task('scripts', function() {
  return gulp.src('**/*.js')
    .pipe(gulpif(options.env === 'production', uglify())) // only minify in production
    .pipe(gulp.dest('dist'));
});

Sonra yudum çalıştırın:

$ gulp scripts --env development

Kaynak


2
var isProduction = (process.argv.indexOf("production")>-1);

CLI gulp productionüretim görevimi çağırıyor ve herhangi bir koşul için bir bayrak belirliyor.


1

İçin bir tane - Farklı ortamlar için farklı bir yapılandırma dosyası geçmek istedi üretim , dev ve test . Bu gulp dosyasındaki koddur:

//passing in flag to gulp to set environment
//var env = gutil.env.env;

if (typeof gutil.env.env === 'string') {
  process.env.NODE_ENV = gutil.env.env;
}

App.js dosyasındaki kod budur:

  if(env === 'testing'){
      var Config = require('./config.testing.js');
      var Api = require('./api/testing.js')(Config.web);
    }
    else if(env === 'dev'){
       Config = require('./config.dev.js');
        Api = require('./api/dev.js').Api;
    }
    else{
       Config = require('./config.production.js');
       Api = require('./api/production.js')(Config.web);
    }

Ve sonra onu yutmak için --env=testing


1

Bu sorunun gönderilmesinden bu yana biraz zaman geçti, ama belki birine yardım edecek.

GULP CLI 2.0.1 (global olarak kurulu) ve GULP 4.0.0 (yerel olarak kurulu) kullanıyorum. Burada ek bir eklenti olmadan nasıl yapacağınız. Kodun oldukça açıklayıcı olduğunu düşünüyorum.

var cp = require('child_process'), 
{ src, dest, series, parallel, watch } = require('gulp');

// == availableTasks: log available tasks to console
function availableTasks(done) {
  var command = 'gulp --tasks-simple';
  if (process.argv.indexOf('--verbose') > -1) {
    command = 'gulp --tasks';
  }
  cp.exec(command, function(err, stdout, stderr) {
    done(console.log('Available tasks are:\n' + stdout));
  });
}
availableTasks.displayName = 'tasks';
availableTasks.description = 'Log available tasks to console as plain text list.';
availableTasks.flags = {
  '--verbose': 'Display tasks dependency tree instead of plain text list.'
};
exports.availableTasks = availableTasks;

Ve konsoldan çalıştırın:

gulp availableTasks

Sonra çalıştırın ve farklılıkları görün:

gulp availableTasks --verbose
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.