Gulpfile
を開発しています。変更後すぐに再起動することはできますか? CoffeeScriptで開発しています。 Gulp
watch Gulpfile.coffee
変更が保存されたときに再起動するには?
task
を作成して、gulp.watch
ために gulpfile.js
そして単純に spawn
別のgulp child_process 。
var gulp = require('gulp'),
argv = require('yargs').argv, // for args parsing
spawn = require('child_process').spawn;
gulp.task('log', function() {
console.log('CSSs has been changed');
});
gulp.task('watching-task', function() {
gulp.watch('*.css', ['log']);
});
gulp.task('auto-reload', function() {
var p;
gulp.watch('gulpfile.js', spawnChildren);
spawnChildren();
function spawnChildren(e) {
// kill previous spawned process
if(p) { p.kill(); }
// `spawn` a child `gulp` process linked to the parent `stdio`
p = spawn('gulp', [argv.task], {stdio: 'inherit'});
}
});
再起動が必要になったら実行する「メインタスク」を受け入れるために、 yargs
を使用しました。したがって、これを実行するには、次のように呼び出します。
gulp auto-reload --task watching-task
テストするには、touch gulpfile.js
またはtouch a.css
ログを表示します。
gulper を作成しました。これは、gulpfileの変更時にgulpを再起動するgulp.js cliラッパーです。
Gulpをgulperに単純に置き換えることができます。
$ gulper <task-name>
この目的のために小さなシェルスクリプトを使用します。これはWindowsでも機能します。
押す Ctrl+C
スクリプトを停止します。
// gulpfile.js
gulp.task('watch', function() {
gulp.watch('gulpfile.js', process.exit);
});
Bash Shellスクリプト:
# watch.sh
while true; do
gulp watch;
done;
Windowsバージョン:watch.bat
@echo off
:label
cmd /c gulp watch
goto label
私はCaio Cunhaの答えのソリューションでEADDRINUSE
エラーの束を受け取っていました。 gulpfileは connect および LiveReload でローカルWebサーバーを開きます。古いプロセスが強制終了される前に、新しいgulpプロセスが古いプロセスと短時間共存するように見えるため、ポートはまもなくダイプロセスに使用されます。
共存問題を回避する同様のソリューションを次に示します(主に this に基づいています):
var gulp = require('gulp');
var spawn = require('child_process').spawn;
gulp.task('gulp-reload', function() {
spawn('gulp', ['watch'], {stdio: 'inherit'});
process.exit();
});
gulp.task('watch', function() {
gulp.watch('gulpfile.js', ['gulp-reload']);
});
これはかなりうまく機能しますが、かなり深刻な副作用が1つあります。最後のgulpプロセスは端末から切断されます。したがって、gulp watch
が終了しても、孤立したgulpプロセスはまだ実行中です。私はその問題を回避することができませんでした、余分なgulpプロセスを手動で強制終了するか、構文エラーをgulpfile.jsに保存するだけです。
これに対する別の解決策は、require.cache
。
var gulp = require('gulp');
var __filenameTasks = ['lint', 'css', 'jade'];
var watcher = gulp.watch(__filename).once('change', function(){
watcher.end(); // we haven't re-required the file yet
// so is the old watcher
delete require.cache[__filename];
require(__filename);
process.nextTick(function(){
gulp.start(__filenameTasks);
});
});
これは非常に古い質問であることは知っていますが、これはGoogleのトップコメントなので、非常に関連性があります。
ソースgulpfile.jsが使用中のディレクトリとは異なるディレクトリにある場合の簡単な方法を次に示します。 (これは重要です!)gulpモジュール gulp-newer および gulp-data を使用します。
var gulp = require('gulp' )
, data = require('gulp-data' )
, newer = require('gulp-newer' )
, child_process = require('child_process')
;
gulp.task( 'gulpfile.js' , function() {
return gulp.src( 'sources/gulpfile.js' ) // source
.pipe( newer( '.' ) ) // check
.pipe( gulp.dest( '.' ) ) // write
.pipe( data( function(file) { // reboot
console.log('gulpfile.js changed! Restarting gulp...') ;
var t , args = process.argv ;
while ( args.shift().substr(-4) !== 'gulp' ) { t=args; }
child_process.spawn( 'gulp' , args , { stdio: 'inherit' } ) ;
return process.exit() ;
} ) )
;
} ) ;
それはこのように動作します:
パイプに再起動機能を挿入する方法は他にもたくさんあります。とにかく、すべてのgulpファイルでgulp-dataを使用しています。独自の解決策をコメントしてください。 :)
Nodemonをグローバルにインストールします:npm i -g nodemon
そして、.bashrc(または.bash_profileまたは.profile)にエイリアスを追加します:
alias gulp='nodemon --watch gulpfile.js --watch gulpfile.babel.js --quiet --exitcrash --exec gulp'
これは、ファイルgulpfile.jsおよびgulpfile.babel.jsの変更を監視します。 ( Google を参照)
PS。これは、無限のタスク(watch
など)には役立ちますが、単一の実行タスクには役立ちません。つまり、監視を使用しているため、gulpタスクが完了した後でも処理を続行します。 ;)
このコードを試してください(win32プラットフォームのみ)
gulp.task('default', ['less', 'scripts', 'watch'], function(){
gulp.watch('./gulpfile.js').once('change' ,function(){
var p;
var childProcess = require('child_process');
if(process.platform === 'win32'){
if(p){
childProcess.exec('taskkill /PID' + p.id + ' /T /F', function(){});
p.kill();
}else{
p = childProcess.spawn(process.argv[0],[process.argv[1]],{stdio: 'inherit'});
}
}
});
});
Visual Studioタスクランナーでも機能するWindowsの優れたソリューション。
/// <binding ProjectOpened='auto-watchdog' />
const spawn = require('child-proc').spawn,
configPaths = ['Gulpconfig.js', 'bundleconfig.js'];
gulp.task('watchdog', function () {
// TODO: add other watches here
gulp.watch(configPaths, function () {
process.exit(0);
});
});
gulp.task('auto-watchdog', function () {
let p = null;
gulp.watch(configPaths, spawnChildren);
spawnChildren();
function spawnChildren() {
const args = ['watchdog', '--color'];
// kill previous spawned process
if (p) {
// You might want to trigger a build as well
args.unshift('build');
setTimeout(function () {
p.kill();
}, 1000);
}
// `spawn` a child `gulp` process linked to the parent `stdio`
p = spawn('gulp', args, { stdio: 'inherit' });
}
});
他の回答と比較した主な変更点:
これは、通常のGulpタスクプロシージャに沿った@CaioToOnのリロードコードの別のバージョンです。また、yargs
にも依存しません。
生成を要求し、プロセス変数を初期化します(yargs
は不要です):
_var spawn = require('child_process').spawn;
var p;
_
デフォルトのgulpタスクはスポーナーです:
_gulp.task('default', function() {
if(p) { p.kill(); }
// Note: The 'watch' is the new name of your normally-default gulp task. Substitute if needed.
p = spawn('gulp', ['watch'], {stdio: 'inherit'});
});
_
監視タスクはおそらくデフォルトのgulpタスクでした。名前をwatch
に変更し、gulpfileを監視するためのgulp.watch()
を追加し、変更に対してdefault
タスクを実行します。
_gulp.task('watch', ['sass'], function () {
gulp.watch("scss/*.scss", ['sass']);
gulp.watch('gulpfile.js', ['default']);
});
_
さて、gulp
を実行するだけで、gulpfileを変更すると自動的にリロードされます!
私は同じ問題に取り組んできましたが、私の場合の解決策は実際には非常に簡単でした。二つのこと。
npm install nodemon -g
(または必要に応じてローカル)cmdで実行するか、次のようなパッケージにスクリプトを作成します。
"dev": "nodemon --watch gulpfile.js --exec gulp"
ちょうどタイプnpm run dev
--watch
は、監視するファイルを指定します。 --exec
は、次の行で実行することを示し、gulp
はデフォルトのタスクです。デフォルト以外のタスクが必要な場合は、引数を渡すだけです。
それが役に立てば幸い。
編集:それを派手に;;さて、最初の部分はあなたが望んでいたものを達成するはずですが、私のセットアップでは、本当にユーザーフレンドにするためにもう少し追加する必要がありました。私が欲しかったのは
最初の部分で述べたことだけを行うと、毎回ページが開きます。修正するには、ページを開くgulpタスクを作成します。このような :
gulp.task('open', function(){
return gulp
.src(config.buildDest + '/index.html')
.pipe(plugins.open({
uri: config.url
}));
次に、私の主なタスクで私が持っています:
gulp.task('default', ['dev-open']);
gulp.task('dev-open', function(done){
plugins.sequence('build', 'connect', 'open', 'watch', done);
});
gulp.task('dev', function(done){
plugins.sequence('build', 'connect', 'watch', done);
});
次に、npmスクリプトを変更して
"dev": "gulp open & nodemon --watch gulpfile.js --watch webpack.config.js --exec gulp dev"
まさにあなたが望むものを提供します。最初にページを開き、ライブリロードを続けます。ライブリロードの場合、私は常に同じポートを使用する接続に付属しているものを使用します。お役に立てば幸いです!
Gulp-restartをインストールする
_npm install gulp-restart
_
このコードはあなたのために働きます。
var gulp = require('gulp'); var restart = require('gulp-restart');
gulp.task('watch', function() { gulp.watch(['gulpfile.js'], restart); })
gulpfile.jsで変更を行うとgulpが再起動します
これは、「gulp」と入力するだけでデフォルトのタスクとして設定できることを理解しやすい短いバージョンです。
gulp.task('watch', function() {
const restartingGulpProcessCmd = 'while true; do gulp watch2 --colors; done;';
const restartingGulpProcess = require('child_process').exec(restartingGulpProcessCmd);
restartingGulpProcess.stdout.pipe(process.stdout);
restartingGulpProcess.stderr.pipe(process.stderr);
});
gulp.task('watch2', function() {
gulp.watch(['config/**.js', 'webpack.config.js', './gulpfile.js'],
() => {
console.log('Config file changed. Quitting so gulp can be restarted.');
process.exit();
});
// Add your other watch and build commands here
}
gulp.task('default', ['watch']);