gulp.run เลิกใช้งานแล้ว ฉันจะเขียนงานได้อย่างไร?


98

นี่คืองานที่ประกอบขึ้นซึ่งฉันไม่รู้ว่าจะแทนที่ด้วยการอ้างอิงงานได้อย่างไร

...
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 [เลิกใช้ 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']);
});

คุณไม่จำเป็นต้องส่งผ่านฟังก์ชันอีกต่อไป (แม้ว่าคุณจะยังทำได้) เพื่อเรียกใช้งาน คุณสามารถตั้งชื่องานให้กับนาฬิกาและมันจะทำเพื่อคุณ


13
จะเกิดอะไรขึ้นถ้าฉันต้องการเรียกใช้งานบางอย่างก่อนที่จะเริ่มดู เช่นฉันต้องการดูscriptsแต่มันก็สมเหตุสมผลเช่นกันที่จะบังคับให้รันงานนี้ทันที (โดยไม่ต้องรอจนกว่าไฟล์สคริปต์บางไฟล์จะเปลี่ยน)
พระคุณเจ้า

4
และมีวิธีใดบ้างที่จะส่งผ่านข้อโต้แย้งไปยังงานเหล่านั้น?
Dr. Ernie

7
@rachel ไม่เกี่ยวข้องกับคำถามที่ Monsingor ถาม
Mark Amery

6
@Monsingor เพื่อให้บรรลุเป้าหมายนั้นคุณสามารถกำหนดงานใหม่ที่ดำเนินการรายการงานได้ ตัวอย่างเช่นฉันมักจะกำหนดงานเริ่มต้นต่อไปนี้gulp.task('default', ['build', 'watch']);ซึ่งจะสร้างก่อนแล้วจึงเริ่มดู
Bastiaan van den Berg

1
@BastiaanvandenBerg ฉันคิดว่างานอึกถูกออกแบบมาให้ทำงานแบบขนาน? ดังนั้นแม้ว่าคุณจะแสดงรายการบิวด์ก่อน แต่ก็ไม่จำเป็นต้องเสร็จสิ้นก่อนที่งานนาฬิกาจะเริ่มทำงาน ฉันได้รับจาก OP ที่พวกเขาต้องการให้แน่ใจว่าการสร้างเสร็จสิ้นก่อนที่นาฬิกาจะเริ่ม
Sean Ryan

85

หรือคุณสามารถทำได้ดังนี้:

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

3
ปลอดภัยที่จะใช้? ผมไม่เห็นว่ามันกล่าวถึงในเอกสารของ API (ลิงค์)
Felix Rabe

4
.startเป็นวิธี Orchestrator เนื่องจาก Gulp สืบทอดมาจากสิ่งนั้นจึงควรใช้งานได้ ฉันกำลังทริกเกอร์งานอึกจากฟังก์ชัน non-gulp (watchify) และดูเหมือนจะใช้งานได้
joemaller

24
gulp.startจะถูกลบออกในรุ่นถัดไป: github.com/gulpjs/gulp/issues/505#issuecomment-45379280
yckart

13
@yckart แล้วเราจะใช้อะไรในการสั่งงาน?
chovy

6
การยกเลิกสิ่งนี้การใช้งานส่วนใหญ่gulp-startสามารถแทนที่ได้ด้วยrun-sequence npmjs.com/package/run-sequence
joemaller

25

แหล่งที่มา: https://github.com/gulpjs/gulp/issues/755

gulp.start()ไม่เคยถูกกำหนดให้เป็น API สาธารณะหรือใช้ และตามที่ระบุไว้ข้างต้นในความคิดเห็นการจัดการงานจะถูกแทนที่ในรุ่นถัดไป .... ดังนั้นgulp.start()จะทำลาย

ความตั้งใจที่แท้จริงของการออกแบบอึกคือการสร้างฟังก์ชั่น 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 ซึ่งกำลังจะหายไป คำตอบที่สามชี้ให้เห็นว่าควรใช้ฟังก์ชันปกติ แต่ตัวอย่างดูแปลก ๆ ฉันค้นหาบางส่วน แต่ไม่พบตัวอย่างง่ายๆ

นี่คือทางออกของฉัน แนวคิดคือการกำหนดฟังก์ชัน 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()ก่อนที่buildTask()จะได้รับการยืนยันว่าเสร็จสมบูรณ์หรือไม่ ฉันรู้สึกว่านี่เป็นเงื่อนไขการแข่งขันและไม่รับประกันว่าจะสร้างก่อนนาฬิกา
Sean Ryan


5

ตามที่ @dman กล่าวไว้ว่าgulp.startจะถูกทิ้งในเวอร์ชันถัดไป นอกจากนี้ยังสามารถเห็นได้ในปัญหาของอึกนี้

และในความคิดเห็นของคำตอบของ @Pavel Evstigneev @joemaller กล่าวว่าเราสามารถใช้ลำดับการรันในสถานการณ์นี้ได้

แต่โปรดทราบว่าผู้เขียนลำดับการทำงานกล่าวว่า:

นี่เป็นวิธีแก้ปัญหาชั่วคราวจนกว่าจะปล่อย gulp 4.0 ซึ่งมีการสนับสนุนสำหรับการกำหนดการอ้างอิงงานในชุดหรือแบบขนาน

โปรดทราบว่าโซลูชันนี้เป็นการแฮ็กและอาจหยุดทำงานกับการอัปเดตในอนาคตอึก

ดังนั้นก่อนอึก 4.0 เราสามารถใช้ลำดับการรันหลังจาก 4.0 เราก็ใช้อึกได้


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รัน (ตัวอย่างเช่นงาน 'จัสมิน' และ 'ฝัง' ของคุณจะเป็นการอ้างอิงและคุณมีงาน 'เซิร์ฟเวอร์' อื่นที่จะขึ้นอยู่กับงานนั้น) ไม่จำเป็นต้องแฮ็กใด ๆ


ไม่แน่ใจว่าไม่นอกประเด็นเพราะตอบเฉพาะคำถามจากความคิดเห็นที่ควรเป็นคำถามแยกกัน
klh

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: ในกรณีที่มีคนสงสัยว่าทำไมฉันถึงต้องการให้งานนาฬิกาของฉันดำเนินการหากงานใด ๆ ที่เกี่ยวข้องล้มเหลวซึ่งโดยปกติแล้วเป็นเพราะฉันใช้นาฬิกาสำหรับการพัฒนาสด เช่น. ฉันเริ่มงานนาฬิกาของฉันเพื่อเริ่มการทดสอบ ฯลฯ และอาจเป็นไปได้ว่ารหัสเริ่มต้นที่ฉันเริ่มต้นด้วยมีปัญหาอยู่แล้วจึงเกิดข้อผิดพลาด

ดังนั้นฉันหวังว่าจะวิ่งอึกหรือเทียบเท่ากันสักพัก


คำตอบใดที่มีอยู่คือการโต้แย้งนี้มุ่งเป้าไปที่?
Mogsdad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.