¿Cómo copio directorios recursivamente con trago?

167

Estoy tratando de organizar un proyecto desde un directorio de trabajo a un servidor (misma máquina). Usando el siguiente código:

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));

Esperaría ver todos los archivos copiados. Sin embargo, aplana la estructura de directorios: todos los directorios se copian pero cada archivo se coloca en la raíz/var/www

Gulp parece una gran herramienta de compilación, ¿pero copiar elementos debería ser un proceso simple?

M1ke
fuente
9
Para los nuevos espectadores que lean esta pregunta, debe tenerse en cuenta que la respuesta más votada no funciona para resolver la especificación de la pregunta original de no aplanar directorios. Resuelve los problemas que tiene la gente con la copia de no todos los archivos dentro de un directorio, ¡así que es útil!
M1ke
1
Al no aplanar, ¿quiere decir que desea que los directorios 'css', 'js' y 'src' estén presentes /var/www/? Puedes intentarlo{css,js,src}/**/*
Jason Goemaat
Sé que la expansión glob funciona dentro de Gulp, pero me confundiría si eso funcionara de manera diferente para cada elemento como una línea individual en una lista, ya que la expansión glob básicamente está destinada a expandirse a una lista antes de la ejecución.
M1ke

Respuestas:

319

Lo siguiente funciona sin aplanar la estructura de carpetas:

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));

La '**/*'es la parte importante. Esa expresión es un globo que es una poderosa herramienta de selección de archivos. Por ejemplo, para copiar solo archivos .js use:'input/folder/**/*.js'

cancerbero
fuente
2
cree que olvidó agregar gulp.dest. Debería ser.pipe(gulp.dest('output/folder'));
Matthew Sprankle
3
¿Cómo se hace esto con una extensión de archivo específica?
Chev
1
¿Puede editar la respuesta para proporcionar un ejemplo para el conjunto original de archivos? No estoy seguro de cómo esto es más apropiado, pero me gustaría ver cómo funciona en comparación con el {base:"."}método.
M1ke
2
Es importante tener en cuenta que el basevalor predeterminado es "carpeta" como se indica en esta respuesta. En otras palabras, la base comienza donde comienza el patrón glob. Esto me ayudó a comprender dónde terminarían mis archivos y también es la razón por la que no necesita **/*el gulp.destparámetro. Gulp toma todo en el globo y lo coloca en la carpeta dest con la misma estructura.
Neil Monroe
3
Esto no responde completamente la pregunta que se hace. Es una buena solución sobre cómo copiar correctamente de forma recursiva, pero no responde cómo modificar el directorio base.
ty1824
173

Resulta que para copiar una estructura de directorio completa gulpdebe proporcionarse una base para su gulp.src()método.

Por gulp.src( [ files ], { "base" : "." })lo tanto, se puede utilizar en la estructura anterior para copiar todos los directorios de forma recursiva.

Si, como yo, puede olvidar esto, intente:

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};
M1ke
fuente
1
Agregue la configuración "cwd" para establecer el directorio de trabajo actual.
Skarllot
3
Si baseaún lo confunde, eche un vistazo a stackoverflow.com/a/35848322/11912, que hace un gran trabajo al explicarlo.
James Skemp
60

Entonces, la solución de proporcionar una base funciona dado que todas las rutas tienen la misma ruta base. Pero si desea proporcionar diferentes rutas base, esto aún no funcionará.

Una forma de resolver este problema fue haciendo que el comienzo del camino sea relativo. Para su caso:

gulp.src([
    'index.php',
    '*css/**/*',
    '*js/**/*',
    '*src/**/*',
])
.pipe(gulp.dest('/var/www/'));

La razón por la que esto funciona es que Gulp establece la base para que sea el final del primer fragmento explícito: el * principal hace que establezca la base en el cwd (¡que es el resultado que todos queremos!)

Esto solo funciona si puede asegurarse de que la estructura de su carpeta no tenga ciertas rutas que puedan coincidir dos veces. Por ejemplo, si tuviera randomjs/el mismo nivel que js, terminaría haciendo coincidir ambos.

Esta es la única forma en que he encontrado que los incluye como parte de una función gulp.src de nivel superior. Sin embargo, probablemente sería simple crear un complemento / función que pudiera separar cada uno de esos globos para poder especificar el directorio base para ellos.

ty1824
fuente
Creo que tener que comenzar con múltiples rutas base probablemente va más allá del alcance de la pregunta. Desde mi pregunta original, estaba moviendo los archivos a una ruta absoluta, pero el problema aún ocurría, que sin especificar una base, todos los archivos de todos mis globos se copiaron en un solo directorio sin seguir su jerarquía existente.
M1ke
2
@ M1ke Es cierto, el punto principal de su pregunta no se dirigió a diferentes rutas de base. Sin embargo, mencionó However it flattens the dir structure - all directories are copied but every file is placed in the root /var/www, y así es como encontré su pregunta: estaba buscando una solución para copiar de forma recursiva con diferentes rutas base. Esencialmente, esta solución funciona para su caso sin tener que especificar una base predeterminada, sino también para un caso de ruta de múltiples bases, siempre que pueda asegurarse de que la estrella principal no coincida con nada :)
ty1824
66
Esta respuesta es excepcional. Se trata específicamente de copiar una ruta desde un punto de inicio arbitrario, por ejemplo. src podría ser 'assets/subdir/*fonts/*'copiar el directorio de fuentes.
Wtower
-4

Si desea copiar todo el contenido de una carpeta de forma recursiva en otra carpeta, puede ejecutar el siguiente comando de Windows desde gulp:

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y

La /yopción al final es suprimir el mensaje de confirmación de sobrescritura.

En Linux, puede ejecutar el siguiente comando desde gulp:

cp -R /path/to/srcfolder /path/to/destfolder

puede usar el complemento gulp-exec o gulp-run para ejecutar comandos del sistema desde gulp.

Enlaces relacionados:

  1. uso de xcopy

  2. gulp-exec y gulp-run

Manoj Amalraj
fuente
77
El problema con volver al shell aquí es que perderías la capacidad de ejecutar otros comandos en la transmisión, como las herramientas de compresión o análisis.
M1ke