javascript - files - gulp uglify
¿Cómo se puede reiniciar Gulp con cada cambio de Gulpfile? (13)
Estoy desarrollando un Gulpfile
. ¿Se puede reiniciar tan pronto como cambie? Lo estoy desarrollando en CoffeeScript. ¿Puede Gulp
mirar Gulpfile.coffee
para reiniciar cuando se guardan los cambios?
Aquí hay otra versión del código de recarga de @ CaioToOn que está más en línea con el procedimiento de tarea Gulp normal. Tampoco depende de yargs
.
Requerir spawn e iniciar la variable de proceso (no se necesita yargs
):
var spawn = require(''child_process'').spawn;
var p;
La tarea predeterminada de gulp será el generador:
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''});
});
Tu tarea de vigilancia fue probablemente tu tarea de trago predeterminada. Cambie el nombre para watch
y agregue un gulp.watch()
para ver su archivo gulp y ejecutar la tarea default
en los cambios:
gulp.task(''watch'', [''sass''], function () {
gulp.watch("scss/*.scss", [''sass'']);
gulp.watch(''gulpfile.js'', [''default'']);
});
Ahora, solo ejecuta gulp
y se volverá a cargar automáticamente si cambias tu gulpfile.
Aquí hay una versión corta que es fácil de entender y que puede establecer como una tarea predeterminada, por lo que solo debe escribir "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'']);
Estaba recibiendo un montón de errores de EADDRINUSE
con la solución en la respuesta de Caio Cunha. My gulpfile abre un servidor web local con connect y LiveReload . Parece que el nuevo proceso de trago coexiste brevemente con el antiguo antes de que se mate el proceso anterior, por lo que los puertos todavía están en uso por el proceso que pronto se va a morir.
Aquí hay una solución similar que soluciona el problema de coexistencia (basado principalmente en 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'']);
});
Eso funciona bastante bien, pero tiene un efecto secundario bastante serio: el último proceso de trago está desconectado de la terminal. Entonces, cuando sale gulp watch
, todavía hay un proceso de trago huérfano. No he podido evitar ese problema, el proceso extra gulp puede eliminarse manualmente o simplemente guardar un error de sintaxis en gulpfile.js .
He estado lidiando con el mismo problema y la solución en mi caso fue muy simple. Dos cosas.
-
npm install nodemon -g
(o localmente si lo prefieres) ejecutar con cmd o crear una secuencia de comandos en paquetes como este:
"dev": "nodemon --watch gulpfile.js --exec gulp"
El tipo simplemente
npm run dev
--watch
especifica el archivo que debe --watch
. --exec
dice ejecutar siguiente en línea y gulp
es tu tarea predeterminada. Solo pase el argumento si desea una tarea que no sea la predeterminada.
Espero eso ayude.
EDITAR: Haciendo que sea elegante;) Ahora bien, aunque la primera parte debería lograr lo que buscabas, en mi configuración he necesitado agregar un poco más para que sea realmente amiga del usuario. Lo que yo quería era
- Primero abre la página.
- Busque cambios en gulpfile.js y reinicie gulp si hay alguno
- Disfrútalo así que ten cuidado con los archivos, reconstruye y recarga en caliente
Si solo haces lo que dije en la primera parte, se abrirá la página cada vez. Para solucionarlo, crea una tarea de trago que abrirá la página. Me gusta esto :
gulp.task(''open'', function(){
return gulp
.src(config.buildDest + ''/index.html'')
.pipe(plugins.open({
uri: config.url
}));
Luego en mis tareas principales tengo:
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);
});
Luego, modifica tus scripts npm para
"dev": "gulp open & nodemon --watch gulpfile.js --watch webpack.config.js --exec gulp dev"
Te dará exactamente lo que quieres. Primero abre la página y luego solo mantén la recarga en vivo. Por cierto para livereload uso el que viene con connect que siempre usa el mismo puerto. Espero que te sirva, ¡disfrútalo!
Instalar gulp-restart
npm install gulp-restart
Este código funcionará para ti.
var gulp = require(''gulp''); var restart = require(''gulp-restart'');
gulp.task(''watch'', function() { gulp.watch([''gulpfile.js''], restart); })
se reiniciará gulp donde haces cambios en el archivo gulpfile.js
Instalar nodemon globalmente: npm i -g nodemon
Y agregue su .bashrc (o .bash_profile o .profile) un alias:
alias gulp=''nodemon --watch gulpfile.js --watch gulpfile.babel.js --quiet --exitcrash --exec gulp''
Esto vigilará los cambios de archivo gulpfile.js y gulpfile.babel.js. (ver Google )
PS Esto puede ser útil para tareas sin fin (como watch
) pero no para tareas de ejecución única. Me refiero a que usa reloj, por lo que continuará el proceso incluso después de que termine la tarea de gulp. ;)
Otra solución para esto es actualizar el 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);
});
});
Puede crear una task
que gulp.watch
para gulpfile.js
y simplemente spawn
otro trago 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
para aceptar la ''tarea principal'' para ejecutar una vez que necesitamos reiniciar. Entonces, para ejecutar esto, llamarías:
gulp auto-reload --task watching-task
Y para probar, llame a touch gulpfile.js
o touch a.css
para ver los registros.
Sé que esta es una pregunta muy antigua, pero es un comentario importante en Google, por lo que sigue siendo muy relevante.
Esta es una forma más sencilla, si su fuente gulpfile.js está en un directorio diferente al que está en uso. (¡Eso es importante!) Utiliza los módulos gulp-newer y 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() ;
} ) )
;
} ) ;
Funciona así:
- Truco 1: gulp-newer solo ejecuta las siguientes canalizaciones, si el archivo de origen es más nuevo que el actual. De esta forma nos aseguramos de que no haya reinicio de bucle.
- El ciclo while elimina todo antes e incluye el comando gulp de la cadena de comandos, por lo que podemos pasar por cualquier argumento.
- child_process.spawn genera un nuevo proceso de trago, una salida de entrada de tubería y un error para el padre.
- Truco 2: process.exit mata el proceso actual. Sin embargo, el proceso esperará hasta que finalice el proceso secundario.
Hay muchas otras formas de insertar la función de reinicio en las tuberías. Por casualidad, uso gulp-data en cada uno de mis gulpfiles de todos modos. Siéntase libre de comentar su propia solución. :)
Una buena solución para Windows, que también funciona bien con el programador de tareas de Visual Studio.
/// <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'' });
}
});
Principales cambios en comparación con otras respuestas:
- Utiliza child-proc porque child_process falla en Windows.
- El watchdog se abandona a sí mismo en los cambios de archivos porque en Windows la llamada gulp está envuelta en un script por lotes. La eliminación de la secuencia de comandos por lotes no mataría al mismo trago, por lo que se generarán múltiples relojes a lo largo del tiempo.
- Construir sobre el cambio: por lo general, un cambio de gulpfile también garantiza la reconstrucción del proyecto.
Yo uso un pequeño script de shell para este propósito. Esto también funciona en Windows.
Presione Ctrl+C
para detener el script.
// gulpfile.js
gulp.task(''watch'', function() {
gulp.watch(''gulpfile.js'', process.exit);
});
Script de shell Bash:
# watch.sh
while true; do
gulp watch;
done;
Versión de Windows: watch.bat
@echo off
:label
cmd /c gulp watch
goto label
prueba este código (solo la plataforma 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''});
}
}
});
});
gulper que es gulp.js cli wrapper para reiniciar gulp en gulpfile change.
Puedes simplemente reemplazar el trago con gulper.
$ gulper <task-name>