gulp.runは非推奨です。タスクを作成するにはどうすればよいですか?


97

これは、タスクの依存関係に置き換える方法がわからない合成タスクです。

...
gulp.task('watch', function () {
 var server = function(){
  gulp.run('jasmine');
  gulp.run('embed');
 };
 var client = function(){
  gulp.run('scripts');
  gulp.run('styles');
  gulp.run('copy');
  gulp.run('lint');
 };
 gulp.watch('app/*.js', server);
 gulp.watch('spec/nodejs/*.js', server);
 gulp.watch('app/backend/*.js', server);
 gulp.watch('src/admin/*.js', client);
 gulp.watch('src/admin/*.css', client);
 gulp.watch('src/geojson-index.json', function(){
  gulp.run('copygeojson');
 });
});

対応する変更ログ https://github.com/gulpjs/gulp/blob/master/CHANGELOG.md#35 [deprecate gulp.run]

回答:


82
gulp.task('watch', function () {
  var server = ['jasmine', 'embed'];
  var client = ['scripts', 'styles', 'copy', 'lint'];
  gulp.watch('app/*.js', server);
  gulp.watch('spec/nodejs/*.js', server);
  gulp.watch('app/backend/*.js', server);
  gulp.watch('src/admin/*.js', client);
  gulp.watch('src/admin/*.css', client);
  gulp.watch('src/geojson-index.json', ['copygeojson']);
});

タスクを実行するために関数を渡す必要はありません(まだ渡すことができます)。あなたはwatchにタスク名の配列を与えることができ、それはあなたのためにこれを行います。


13
視聴を開始する前にタスクを実行したい場合はどうすればよいですか?たとえばscripts、を監視したいのですが、(スクリプトファイルが変更されるまで待たずに)このタスクをすぐに強制的に実行することも理にかなっています。
Monsignor 2014年

4
そして、それらのタスクに引数を渡す方法はありますか?
アーニー博士

7
@レイチェルはモンシンガーが尋ねた質問とは無関係です。
マークアメリー2015

6
@Monsingorこれを実現するために、タスクのリストを実行する新しいタスクを定義できます。たとえば、私は通常gulp.task('default', ['build', 'watch']);、最初にビルドしてから監視を開始する次のデフォルトタスクを定義します。
バスティアンヴァンデンベルク

1
@BastiaanvandenBerg gulpタスクは並行して実行するように設計されていると思いましたか?したがって、ビルドを最初にリストしている場合でも、watchタスクが起動する前にビルドを完了する必要はありません。OPから、ウォッチが始まる前にビルドが完了していることを確認したいと思っています。
Sean Ryan

85

または、次のようにすることもできます。

gulp.start('task1', 'task2');

3
これは安全ですか?APIドキュメント(リンク)に記載されていません。
Felix Rabe

4
.startオーケストレータ方式です。Gulpはそれを継承しているため、動作するはずです。非gulp関数(watchify)からgulpタスクをトリガーしていますが、これは機能しているようです。
joemaller 2014年

24
gulp.start次のリリースで削除されます:github.com/gulpjs/gulp/issues/505#issuecomment-45379280
yckart

13
@yckartでは、タスクを実行するために何を使用しますか?
曲がりくねった2014年

6
これを明らかにすると、のほとんどの使用はnpmjs.com/package/run-sequencegulp-startで置き換えることができますrun-sequence
joemaller

25

ソース:https : //github.com/gulpjs/gulp/issues/755

gulp.start()公開APIになることも、使用されることもありませんでした。また、コメントで前述したように、タスク管理は次のリリースで置き換えられgulp.start()ます。

gulpの設計の真の目的は、通常のJavascript関数を作成し、それらを呼び出すタスクのみを作成することです。

例:

function getJsFiles() {
    var sourcePaths = [
        './app/scripts/**/*.js',
        '!./app/scripts/**/*.spec.js',
        '!./app/scripts/app.js'
    ];

    var sources = gulp.src(sourcePaths, { read: false }).pipe(angularFilesort());

    return gulp.src('./app/index.html')
        .pipe(injector(sources, { ignorePath: 'app', addRootSlash: false }))
        .pipe(gulp.dest('./app'));
}  

gulp.task('js', function () {
    jsStream = getJsFiles();
});

12

古い質問を復活させたことを許してください。受け入れられた回答は、ウォッチを設定する前にタスクを実行する問題に対処していません。次の答えは、廃止されるgulp.startを使用します。3番目の答えは、通常の関数を使用する必要があることを示していますが、例は奇妙に見えます。いくつか検索を行いましたが、簡単な例は見つかりませんでした。

これが私の解決策です。アイデアは、通常のjs関数を定義し、タスクとして登録することです。その後、必要に応じて関数を直接呼び出すか、時計内から呼び出すことができます。

var 
  gulp     = require('gulp'),
  concat   = require('gulp-concat'),
  markdown = require('gulp-showdown')
;
var scriptFiles   = [ 'ang/app.js' ];
var markdownFiles = [ 'content/articles/*.md'];

var watchTask = function() 
{
  buildTask();

  gulp.watch(scriptFiles,  ['scripts' ]);
  gulp.watch(markdownFiles,['markdown']);
};
gulp.task('watch',watchTask);

var buildTask = function()
{
  scriptsTask();
  markdownTask();
};
gulp.task('build',buildTask);

var markdownTask = function() 
{
  gulp.src(markdownFiles)
    .pipe(markdown())
    .pipe(gulp.dest('web/articles'));
};
gulp.task('markdown',markdownTask);

var scriptsTask = function() 
{
  gulp.src(scriptFiles)
    .pipe(concat('app.js'))
    .pipe(gulp.dest('web/js'));

  gulp.src(
    [
      'bower_components/angular/angular.min.js',
      'bower_components/angular-route/angular-route.min.js'
    ])
    .pipe(concat('vendor.js'))
    .pipe(gulp.dest('web/js'));

  gulp.src(
    [
      'bower_components/angular/angular.min.js.map',
      'bower_components/angular-route/angular-route.min.js.map'
    ])
    .pipe(gulp.dest('web/js'));
};
gulp.task('scripts', scriptsTask);

私はどんどん始めました。明らかなことを見落としてしまった場合はお知らせください。


これにより、「ビルド」タスクと「リビルド」タスクを簡単に作成できるようになります。どちらも作業を行う関数を呼び出しますが、後者は「クリーン」タスクにも依存しています。
Seth

1
これは、JSが完了が確認gulp.watchされるwatchTask()前に定義されたタスクに移動するという点で、通常のgulpタスクと同じ問題もありませんbuildTask()か?これは依然として競合状態であり、ビルド前の監視を保証するものではないようです。
ショーンライアン

7

ガップ4

gulp.parallel('taskName1', 'taskName2')()
gulp.series('taskName1', 'taskName2')()

私はgulp4が好きです!


たくさん検索した後の最良の答え。ありがとう。
AminFarajzadeh

5

@dmanが言及しているgulp.startように、次のバージョンでは破棄されます。また、今号のgulpでも見ることができます。

また、@ Pavel Evstigneevの回答のコメントで、@ joemallerは、このシナリオで実行シーケンスを使用できることを述べています。

ただし、run-sequenceの作成者は次のように述べています。

これは、タスクの依存関係を直列または並列に定義することをサポートするgulp 4.0のリリースまでの一時的な解決策を意図しています。

このソリューションはハックであり、gulpの将来の更新で機能しなくなる可能性があることに注意してください。

したがって、gulp 4.0以前はrun-sequenceを使用でき、4.0以降はgulpのみを使用できます。


3

実行中のタスクの順序を維持する必要がある場合は、ここで説明するように依存関係を定義できます。依存関係からストリームを返すだけです。

gulp.task('dependency', function () {
  return gulp.src('glob')
    .pipe(plumber())
    .pipe(otherPlugin())
    .pipe(gulp.dest('destination'));
});

それに依存するタスクを定義します。

gulp.task('depends', [ 'dependency' ], function () {
  // do work
});

そして、それを時計から使用します:

gulp.task('watch', function () {
  watch('glob', [ 'depends' ]);
});

これで、dependecyタスクはdepends実行前に完了します(たとえば、「jasmine」タスクと「embed」タスクは依存関係になり、それらに依存する「サーバー」という別のタスクがあるでしょう)。ハッキングの必要はありません。


別の質問でなければならないコメントからの質問にしか答えないので、トピックから外れていないかどうかはわかりません
キラー

2

Gulp 4で私のために機能しているように見える唯一のものは、次のとおりです。

gulp.task('watch', function() {
    gulp.watch(['my-files/**/*'], gulp.series('my-func'));
});

gulp.task('my-func', function() {
    return gulp.src('[...]').pipe(gulp.dest('...'));
});

1

監視を開始する前にタスクを実行するには、gulp.run()またはgulp.start()を使用する代わりに、まっすぐにgulpコマンドを実行します。

だから代わりに:

var compress = function () {
    return gulp.src('js/vendor/*.js')
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest('./build/js/'));
};

ただやる:

gulp.src('js/vendor/*.js')
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest('./build/js/'));

または、後者のコードを「通常の」関数でラップして、いつでも呼び出すことができます。

- 同様のスレッドからのこの回答に触発されました。


0

これが実際に当面の問題をどのように解決するかまだわかりません。

4つのタスク間に依存関係が定義されているタスクがある場合

あいうえお

ここで、AはBに依存し、などによって定義されたgulp.task('A',['B'],function A(){});後、関数を実行するgulp.watchを使用して新しいタスクを定義すると、依存関係が複製されます。

たとえば、これらのタスクが与えられた場合(各タスク関数は名前で公開されます):

function A(){}
gulp.task('A',['B'],A);

function A(){}
gulp.task('A',['B'],A);

function B(){}
gulp.task('B',['C'],B);

function C(){}
gulp.task('C',['D'],C);

function D(){}
gulp.task('D',[],D);

私は書くことができます1)

gulp.task('WATCHER', ['A'], function(){
   ...
}

これはA-> Dを実行しますが、たとえばステップBが失敗した場合、タスクに入ることができません(コンパイルエラーまたはテストエラーと考えてください)。

または私は書くことができます2)

gulp.task('WATCHER', [], function(){
   gulp.watch(...,['A'])
}

最初に何かが変更されるまで、A-> Dは実行されません。

または私は書くことができます3)

gulp.task('WATCHER', [], function(){
   D();
   C();
   B();
   A();
   gulp.watch(...,['A'])
}

これにより、依存関係の階層の重複(および時間の経過に伴うエラー)が発生します。

PS:誰かが依存関係のあるタスクのいずれかが失敗した場合に、なぜウォッチタスクを実行する必要があるのか​​と思っている場合は、通常、ライブ開発にウォッチを使用しているためです。例えば。監視タスクを開始して、テストなどの作業を開始します。最初に開始したコードにすでに問題があるため、エラーが発生している可能性があります。

だから私はgulp runまたはいくつかの同等のものがしばらくの間滞在することを願っています


この反論はどの既存の回答を目的としていますか?
Mogsdad 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.