গুলপকে এটি বিভিন্ন উপায়ে কাজ চালানোর জন্য কী কোনও পতাকা পাস করা সম্ভব?


369

সাধারণত গুল্পের কাজগুলিতে এ জাতীয় চেহারা দেখা যায়:

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));
});

কমান্ড লাইনের পতাকাটি ঝাঁকুনির কাছে পৌঁছে দেওয়া (এটি কোনও কাজ নয়) এবং এটি কি এর ভিত্তিতে শর্তাধীন কাজ চালানো সম্ভব? এই ক্ষেত্রে

$ gulp my-task -a 1

এবং তারপরে আমার গুল্পফিল.জেজে:

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
এটি নোডে চলার সাথে সাথে আপনি সম্ভবত process.argvকমান্ড লাইন যুক্তিগুলি অ্যাক্সেস করতে ব্যবহার করতে পারেন।
zzzzBov

উত্তর:


528

গুল্প এর জন্য কোনও ধরণের ব্যবহারের প্রস্তাব দেয় না, তবে আপনি অনেকগুলি কমান্ড আরগ পার্সারগুলির মধ্যে একটি ব্যবহার করতে পারেন। আমি চাই yargs। হতে হবে:

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));
});

আপনি এটি gulp-ifশর্তসাপেক্ষে স্ট্রিমটি পাইপের সাথে একত্রিত করতে পারেন , ডেভ বনাম প্রোড বিল্ডিংয়ের জন্য খুব দরকারী:

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/'));
});

এবং কল gulp my-js-taskবা gulp my-js-task --production


45
এটি কোনওভাবে @ সরকারী গুল্প গিথুব, প্রয়োজনীয় জিনিসগুলি উল্লেখ করা উচিত!
সর্বোচ্চ

2
এটি, ভিডিওটি ইয়ার্গস ছাড়াই কীভাবে এটি অর্জন করতে হবে তা ব্যাখ্যা করে: youtube.com/watch?v=gRzCAyNrPV8
প্ল্যাঙ্কগুই

9
হাই @ প্ল্যাঙ্কগুই, ভিডিওটি খুব সুন্দর। ধন্যবাদ। এটি দেখায় যে কোনও ফলশ্রুতি ছাড়াই কীভাবে পরিবেশের পরিবর্তনশীলগুলি পার্স করতে হয় to একটি ছোট পার্থক্যটি হ'ল ভিডিওটি পরিবেশের পরিবর্তনশীল সম্পর্কে , যখন উপরের উদাহরণটি কমান্ড লাইন আর্গুমেন্ট সম্পর্কে , যেখানে ইয়ার্গস এখনও অন্য একটি সরঞ্জাম যা ভেরিয়েবলগুলি পার্সিং বিমূর্ত করে গ্রাসকে সহজতর করতে সহায়তা করে।
Caio Cunha

12
আপনি যদি ব্যবহার করেন npm run gulpতবে আপনার এটির মতো ব্যবহার করা উচিত npm run gulp -- --production
ivkremer

3
এটি @ সরকারী গুল্প গিথুব (আক্ষরিকভাবে) এর উল্লেখ রয়েছে।
fracz

101

সম্পাদন করা

gulp-utilঅবচয় করা হয়েছে এবং এড়ানো উচিত, সুতরাং এর পরিবর্তে মিনিমিস্ট ব্যবহার করার পরামর্শ দেওয়া হচ্ছে যা gulp-utilইতিমধ্যে ব্যবহৃত হয়েছে।

সুতরাং আমি আমার গুল্পফাইলে কিছু লাইন মুছে ফেলার জন্য পরিবর্তন করেছি gulp-util:

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

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

মূল

আমার প্রকল্পে আমি নীচের পতাকাটি ব্যবহার করি:

gulp styles --theme literature

গুল্প তার জন্য একটি বিষয় gulp.envসরবরাহ করে। এটি আরও নতুন সংস্করণগুলিতে নষ্ট হয়েছে, সুতরাং আপনাকে অবশ্যই এটির জন্য গল্প-ব্যবহার ব্যবহার করতে হবে। কাজগুলি দেখতে এরকম দেখাচ্ছে:

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' }));
});

সমস্ত সাব-টাস্কের সময় পরিবেশ সেটিং উপলব্ধ। সুতরাং আমি এই পতাকাটি ওয়াচ টাস্কেও ব্যবহার করতে পারি:

gulp watch --theme literature

এবং আমার শৈলীর কাজও কাজ করে।

সিওও রাল্ফ


6
gulp.envআপনি অবহেলিত হচ্ছেন , এটি চালানোর সময় আপনি কনসোল লগ বার্তা দ্বারা দেখতে পাচ্ছেন। তারা আপনাকে আপনার নিজের পার্সার ব্যবহার করতে এবং পরামর্শ দিতে yargsবা বলতে বলে minimist
কাইও চুনহা

2
আপনার ইঙ্গিতটির জন্য ধন্যবাদ @ কায়ো টনওন। আমি আমার উত্তরটি এবং আমার প্রজেক্টটিও আপডেট করেছি;)
আরডাব্ল্যাম

4
আপনি সংক্ষিপ্ত util.env.theme ? util.env.theme : 'main'করতে পারেন util.env.theme || 'main'। যাইহোক +1।
রেনান

9
gulp-utilসদ্ব্যবহার minimistকমান্ড লাইন আর্গুমেন্ট পার্সিং জন্য লাইব্রেরী। সুতরাং আপনি যদি ব্যবহার করছেন তবে gulp-utilসেই উদ্দেশ্যে আপনার কোনও অতিরিক্ত লাইব্রেরি লাগবে না। দস্তাবেজ: github.com/substack/minimist
রক্যালাইট

57

আমি পেয়েছি একটি দ্রুত রেসিপি এখানে:

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

আসল রেফ (আর উপলভ্য নয়): https://github.com/gulpjs/gulp/blob/master/docs/recines/pass-params-from-cli.md

মিনিমিনিস্টের সাথে বিকল্প

আপডেট রেফ থেকে: https://github.com/gulpjs/gulp/blob/master/docs/recips/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
সেই রেসিপিটির লিঙ্কটি এখন চলে গেছে। এর পরিবর্তে আরও একটি রয়েছে যা সর্বনিম্ন প্যাকেজটি ব্যবহার করে: Pass-arguments-from-cli.mdগল্প নিজেই মিনিমিস্ট ব্যবহার করে যে বিষয়টি বোঝায়
yuvilio

39

on/offযুক্তিগুলি পার্স না করে পতাকা করার খুব সহজ উপায় আছে । gulpfile.jsকেবল একটি ফাইল যা অন্যের মতো কার্যকর করা হয়, তাই আপনি এটি করতে পারেন:

var flags = {
  production: false
};

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

এবং gulp-ifশর্তসাপেক্ষে একটি পদক্ষেপ কার্যকর করার মতো কিছু ব্যবহার করুন

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

এক্সিকিউট করা gulp buildএকটি দুর্দান্ত এইচটিএমএল তৈরি করবে, যখন gulp production buildএটি এটিকে ছোট করে দেবে।


2
দুর্দান্ত ধারণা, ইয়ার্গস ব্যবহার করে সংরক্ষণ করে, আমি 'প্রি-প্রোডাকশন' টাস্কটি তৈরি করে তা প্রসারিত করেছি এবং তারপরে 'উত্পাদন' এর ['বিল্ড', 'প্রাক-উত্পাদন'] এর নির্ভরতা অ্যারে রয়েছে ar এইভাবে আপনি কেবল 'গুল্প উত্পাদন' চালাতে পারেন।
কেগান 82

নিস! আমি gulp.task('mytask', function() { if (flags.myflag ) { flaggedtask } else { unflaggedask } });
হেনরি

আমি মনে করি এটি করার
উপকারটি

@ কেগানহায়ারস্টাইল 82২২ তে আমিও তেমন কিছু করেছি তবে রান-সিকোয়েন্সটি ব্যবহার করতে হয়েছিল যাতে সম্পত্তি নির্ধারণের সময় কোনও রেসের শর্ত ছিল না তা নিশ্চিত করতে flags
CalMlynarczyk

3
এই পদ্ধতির অসুবিধাটি হ'ল প্রতিবার আপনি টার্মিনালের গাল্প কমান্ডে যুক্তিগুলি না দিয়ে ফ্ল্যাগ ভেরিয়েবলগুলি পরিবর্তন করতে চান প্রতিবার gulpfile.js পরিবর্তন করতে হবে।
jbyrd

33

যদি আপনি কিছু কঠোর (অর্ডারযুক্ত!) আর্গুমেন্ট হন তবে আপনি কেবল তা পরীক্ষা করে তা পেতে পারেন process.argv

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

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

এটি কার্যকর করুন: gulp --env production

... তবে আমি মনে করি যে এই হল আমিও কঠোর এবং বুলেটপ্রুফ! সুতরাং, আমি কিছুটা চারপাশ ... এবং এই ইউটিলিটি ফাংশন দিয়ে শেষ করেছি:

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

এটি একটি যুক্তি-নাম খায় এবং এটি এর জন্য অনুসন্ধান করবে process.argv। কিছু না পাওয়া গেলে তা থুথু ফেলে দেয় null। অন্যথায় যদি তাদের পরবর্তী কোনও যুক্তি না হয় বা পরের যুক্তিটি হুকুম হয় এবং মান না হয় (আমরা কোনও ড্যাশের সাথে পৃথক হয়ে থাকি) trueফিরে আসে। (এটি কারণ কীটি বিদ্যমান, তবে এর কোনও মূল্য নেই)। যদি এর আগে সমস্ত মামলা ব্যর্থ হয় তবে পরবর্তী যুক্তি-মানটি আমরা পাই।

> 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

ঠিক আছে, আপাতত যথেষ্ট ... গাল্প ব্যবহার করে একটি সাধারণ উদাহরণ এখানে :

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"));
});

চালাও এটা gulp --env production


আর্গুমেন্টের নামটি ড্যাশ (এস) এর সাথে উপসর্গ করা উচিত: if (args[0] === '--env' && args[1] === 'production');কমপক্ষে 3.8.11
পিয়োট্র_সিজে

@ ইয়াকার্ট - আপনার কোড উদাহরণে getArg এর জন্য সম্ভবত আপনার প্রয়োজনীয় ('..') যুক্ত করা উচিত।
jbyrd

7

আমি কমান্ডলাইন থেকে টাস্ক কলব্যাকের জন্য পরামিতিগুলি ইনজেক্ট করার জন্য একটি প্লাগইন তৈরি করেছি।

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

// gulp mytask --production

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

যদি কেউ বাগ খুঁজে পায় বা এর কোনও উন্নতি হয় তবে আমি পিআরগুলিকে একীভূত করে খুশি happy


4

এবং যদি আপনি টাইপ স্ক্রিপ্ট ( gulpfile.ts) ব্যবহার করে থাকেন তবে yargsএটির জন্য করুন (@ কাইও কুনার দুর্দান্ত উত্তরের জন্য বিল্ডিং https://stackoverflow.com/a/23038290/1019307 এবং উপরের অন্যান্য মন্তব্যে)

ইনস্টল করুন

npm install --save-dev yargs

typings install dt~yargs --global --save

.ts নথি পত্র

এটি .ts ফাইলগুলিতে যুক্ত করুন:

import { argv } from 'yargs';

...

  let debug: boolean = argv.debug;

এটি প্রতিটি .ts ফাইলে স্বতন্ত্রভাবে করতে হয় (এমনকি যে tools/tasks/projectফাইলগুলিতে আমদানি করা হয়gulpfile.ts/js )।

চালান

gulp build.dev --debug

বা আন্ডার npmমাধ্যমে আর্কটি পেরিয়ে যেতে পারেন:

npm run build.dev -- --debug

2

কমান্ড লাইন থেকে তর্কগুলি পাস করুন

// 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'));
});

তারপরে গুল্প চালান:

$ gulp scripts --env development

সূত্র


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

সি এল এল gulp productionআমার প্রোডাকশন টাস্ককে কল করে এবং কোনও শর্তের জন্য একটি পতাকা সেট করে।


1

আমরা বিভিন্ন পরিবেশের জন্য একটি আলাদা কনফিগার ফাইলটি পাস করতে চেয়েছিলাম - একটি উত্পাদন , দেব এবং পরীক্ষার জন্য । গুল্প ফাইলে এটি কোড:

//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 ফাইলের কোড:

  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);
    }

এবং তারপর এটি দুলতে চালাতে --env=testing


1

এই প্রশ্নটি পোস্ট হওয়ার পরে অনেক সময় হয়েছে, তবে এটি কারওর পক্ষে সহায়তা করবে।

আমি গুলপ সিএলআই ২.০.১ ব্যবহার করছি (বিশ্বব্যাপী ইনস্টল করা) এবং গুলপ ৪.০.০ (স্থানীয়ভাবে ইনস্টল করা) এখানে কোনও অতিরিক্ত প্লাগইন ছাড়াই আপনি কীভাবে করেন তা এখানে। আমি মনে করি কোডটি বেশ স্ব-ব্যাখ্যামূলক।

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;

এবং কনসোল থেকে চালান:

gulp availableTasks

তারপরে রান করুন এবং পার্থক্যগুলি দেখুন:

gulp availableTasks --verbose
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.