Buscando la forma de copiar archivos en gulp y cambiar el nombre según el directorio principal

91

Para cada módulo, tengo algunos archivos que deben copiarse en el directorio de compilación y estoy buscando una manera de minimizar el código repetido de esto:

gulp.src('./client/src/modules/signup/index.js')
  .pipe(gulp.dest('./build/public/js/signup'));

gulp.src('./client/src/modules/admin/index.js')
  .pipe(gulp.dest('./build/public/js/admin'));

a algo como esto:

gulp.src('./client/src/modules/(.*)/index.js')
  .pipe(gulp.dest('./build/public/js/$1'));

Obviamente, lo anterior no funciona, entonces, ¿hay alguna manera de hacer esto, o un npm que ya lo hace?

Gracias

chris
fuente

Respuestas:

131

La mejor manera es configurar su basecuando se obtienen archivos, así:

gulp.src('./client/src/modules/**/index.js', {base: './client/src/modules'})
  .pipe(gulp.dest('./build/public/js/'));

Esto le dice gulpque use el directorio de módulos como punto de partida para determinar las rutas relativas.

(Además, puede usar /**/*.jssi desea incluir todos los archivos JS ...)

Demasiado entusiasta
fuente
6
Debe haber una forma más dinámica de hacer esto: ¿qué pasa cuando los archivos src provienen de 2 directorios diferentes y desea conservar sus directorios en dest?
Ivan Durst
1
@IvanDurst Manejé este caso específico con el código OP (respuesta). usando la configuración base y usando la ruta relativa desde el archivo gulp a archivos independientes y ./folder-example/**carpetas y archivos completos.
Caio Wilson
210

No es la respuesta, pero es aplicable a la aparición de esta pregunta en los resultados de búsqueda.

Para copiar archivos / carpetas en gulp

gulp.task('copy', () => gulp
  .src('index.js')
  .pipe(gulp.dest('dist'))
);
Kirk Strobeck
fuente
2
Hmmm ... mi trago dice que esta tarea se completa, pero el archivo de salida no existe.
Tyguy7
4
Tienes que devolver la transmisión para que Gulp sepa cuando finaliza la tarea.
Merott
2
Estoy confundido por qué una respuesta que dice "no la respuesta" tiene más votos positivos que la respuesta aceptada que sí responde la pregunta. No estoy seguro de que debamos abarrotar SO con respuestas diseñadas para hacer que los motores de búsqueda hagan algo en particular en lugar de proporcionar respuestas a la pregunta. Creo que es trabajo de los motores de búsqueda hacer algo útil de lo que obtienen cuando rastrean el sitio. Solo mi $ 0.02
jinglesthula
9
@jinglesthula Es un servicio útil para quienes llegan a esta pregunta a través de los motores de búsqueda, independientemente de lo bien que esté haciendo su trabajo. Lo aprecio.
jbkly
1
jaja me acabo de dar cuenta de que esto es más popular que la pregunta correcta o la respuesta correcta: P
Kirk Strobeck
5
return gulp.src('./client/src/modules/(.*)/index.js')  
  .pipe(gulp.dest('./build/public/js/$1'));

Trabajó para mi !

usuario2977367
fuente
.. aún así, esta es la respuesta.
Kirk Strobeck
2
... Entonces, ¿puede alguien que reescribir por lo que no trabajo como es, por lo que la gente que viene a esta página en busca de ese fragmento de código exacta en realidad puede usarlo?
Ivan Durst
Entonces ... ¿están permitidos los parens y $ n "backreferences" en src / dest globs? No son expresiones regulares, afaik. Esto parece lo que estoy buscando, pero los documentos de vinyl-fs son bastante concisos en las opciones .src () y .dest () y lo que está permitido en ellas y cómo funcionan.
jinglesthula
3

Se conservará el uso para conservar el árbol del directorio de entrada.

.pipe(gulp.dest(function(file) {
    var src = path.resolve(SRC_FOLDER);
    var final_dist = file.base.replace(src, '');
    return DIST_FOLDER + final_dist;
}))

El uso de este, se puede poner en el src: .src(SRC_FOLDER + '/**/*.js').

Las otras respuestas no me funcionaron (como usar base:on src()}, porque algunos complementos aplanan el árbol de directorios.

brnmonteiro
fuente
0

copiar archivos en paralelo

gulp.task('copy', gulp.parallel(
() =>  gulp.src('*.json').pipe(gulp.dest('build/')),
() =>  gulp.src('*.ico').pipe(gulp.dest('build/')),
() =>  gulp.src('img/**/*').pipe(gulp.dest('build/img/')),
)
);
Dan Alboteanu
fuente