Utilice gulp para seleccionar y mover directorios y sus archivos

98

Actualmente estoy usando gulp para llamar a un script bash que limpia mi dist/directorio y mueve los archivos apropiados al directorio limpio. Me gustaría que esto se hiciera con gulp porque no estoy seguro de que el script funcione en un sistema de archivos que no sea * nix.
Hasta ahora, estoy usando el módulo gulp-clean para limpiar el dist/directorio, pero cuando intento mover los directorios requeridos y sus archivos a la carpeta dist, los directorios están vacíos.

var gulp = require('gulp'),
    clean = require('gulp-clean');

gulp.task('clean', function(){
  return gulp.src(['dist/*'], {read:false})
  .pipe(clean());
});

gulp.task('move',['clean'], function(){
  gulp.src(['_locales', 'icons', 'src/page_action', 'manifest.json'])
  .pipe(gulp.dest('dist'));
});

gulp.task('dist', ['move']);

la llamada gulp distda como resultado que el dist/directorio se complete con los directorios correctos, pero todos están vacíos

$ ls dist/*
dist/manifest.json

dist/_locales:

dist/icons:

dist/page_action:

¿Cómo copio los directorios y su contenido en la dist/carpeta?

makenova
fuente

Respuestas:

162

Debe incluir la baseopción de src, que conservará la estructura del archivo de la manera que desee:

var filesToMove = [
        './_locales/**/*.*',
        './icons/**/*.*',
        './src/page_action/**/*.*',
        './manifest.json'
    ];

gulp.task('move',['clean'], function(){
  // the base option sets the relative root for the set of files,
  // preserving the folder structure
  gulp.src(filesToMove, { base: './' })
  .pipe(gulp.dest('dist'));
});

Además, probablemente tendrá problemas en el futuro si tiene todos estos archivos fuente en la raíz de su proyecto.

Si puede, le recomiendo que use una sola src/carpeta y mueva todos los archivos específicos de su aplicación allí. Esto facilita el avance del mantenimiento y evita que los archivos específicos de la compilación se mezclen con los archivos específicos de la aplicación.

Si hace esto, simplemente reemplace todas las apariciones de ./con src/en el ejemplo anterior.

Demasiado entusiasta
fuente
1
Funcionó perfectamente solo después de reorganizar los archivos, pero su razonamiento es sólido, así que estoy marcando su respuesta como correcta. Gracias.
makenova
2
Para hacer lo contrario, use gulp-flatten. stackoverflow.com/questions/21153338/…
Tony Gutierrez
2
Como nota para cualquier otra persona que haya hecho esto, asegúrese de que no tenga la readopción en src configurada en false(está configurada en trueforma predeterminada).
yndolok
3
Cuando hago esto, se copia con todos los directorios raíz.
Nomadme
5

La pregunta original apunta solo a directorios (también conocidos como carpetas) en su gulp.src, es decir, gulp.src(['_locales', ...en este ejemplo, _localeses el nombre de un directorio .

La respuesta aceptada utiliza un globpatrón en su gulp.srcpara apuntar a archivos en cualquier lugar de esos directorios, es decir gulp.src(['./_locales/**/*.*', ..., (observe los asteriscos dobles y los asteriscos filename.extension ). La respuesta aceptada funciona ...

... pero la respuesta aceptada solo enfatiza la baseopción :

Necesita incluir la baseopción a src ...

Experimenté y encontré:

  1. Estrictamente hablando, no es necesario utilizar la baseopción para lograr lo que pidió el OP: "... y mueve los archivos apropiados al directorio limpio". La baseopción no hecho a preservar el archivo de la carpeta + estructura (como se describe en la respuesta aceptada), pero la baseopción es no suficiente para mover los archivos como el PO pidió . Preservar la estructura de carpetas + archivos es probablemente lo que espera el OP , por lo que la respuesta aceptada es buena, pero ...

  2. Sólo para reiterar lo que hace mover los archivos, son los globpatrones:

    1. El doble asterisco ( .../**/...) busca de forma recursiva en todas las subcarpetas, subcarpetas y subcarpetas, etc.

    2. Filename.extension asteriscos ( .../*.*) busca archivos de todos los nombres y todas las extensiones . ¡Así que creo que esta parte merece el mayor énfasis!

  3. La respuesta aceptada cambia algo más; agrega un prefijo de ./a cada ruta a la que se pasan los argumentos gulp.src. Creo que eso es innecesario / redundante; si no hay ./, (como en la pregunta OP), las rutas se resuelven en relación con el directorio actual, lo que da como resultado el mismo comportamiento . Pero tal vez sea una buena práctica ser explícito con el./

Avísame si me equivoco ...

El guisante rojo
fuente