Come copio le directory in modo ricorsivo con gulp?


167

Sto cercando di mettere in scena un progetto da una directory di lavoro a un server (stessa macchina). Utilizzando il seguente codice:

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

Mi aspetto di vedere tutti i file copiati. Tuttavia appiattisce la struttura dir: tutte le directory vengono copiate ma ogni file viene inserito nella radice/var/www

Gulp sembra un ottimo strumento di compilazione, ma sicuramente copiare elementi dovrebbe essere un processo semplice?


9
A tutti i nuovi spettatori che leggono questa domanda, va notato che la risposta più votata non funziona per risolvere la specifica della domanda originale di directory non appiattite. Risolve i problemi che le persone incontrano non copiando tutti i file all'interno di una directory, quindi è utile!
M1ke,

1
Non appiattendo, vuoi dire che vuoi che siano presenti le directory 'css', 'js' e 'src' /var/www/? Potresti provare{css,js,src}/**/*
Jason Goemaat

So che l'espansione glob funziona all'interno di gulp, ma sarei confuso se funzionasse in modo diverso da ciascun elemento come singola riga in un elenco - poiché l'espansione glob è sostanzialmente intesa solo per espandersi in un elenco prima dell'esecuzione.
M1ke,

Risposte:


319

Quanto segue funziona senza appiattire la struttura delle cartelle:

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

Questa '**/*'è la parte importante. Quell'espressione è un glob che è un potente strumento di selezione dei file. Ad esempio, per copiare solo i file .js utilizzare:'input/folder/**/*.js'


2
pensi di aver dimenticato di aggiungere gulp.dest. Dovrebbe essere.pipe(gulp.dest('output/folder'));
Matthew Sprankle

3
Come si fa con un'estensione di file specifica?
Chev

1
Puoi modificare la risposta per fornire un esempio per il set originale di file? Non sono sicuro di come sia più appropriato, ma sarei felice di vedere come funziona rispetto al {base:"."}metodo.
M1ke

2
È importante notare che l' baseimpostazione predefinita è "cartella" come indicato in questa risposta. In altre parole, la base inizia dove inizia il modello glob. Questo mi ha aiutato a capire dove sarebbero finiti i miei file ed è anche il motivo per cui non hai bisogno **/*del gulp.destparametro. Gulp prende tutto nel glob e lo mette nella cartella dest con la stessa struttura.
Neil Monroe,

3
Questo non risponde completamente alla domanda che viene posta. È una buona soluzione su come copiare correttamente in modo ricorsivo, ma non risponde a come modificare la directory di base.
ty1824,

173

Si scopre che per copiare una struttura di directory completa gulpdeve essere fornita una base per il gulp.src()metodo.

Quindi gulp.src( [ files ], { "base" : "." })può essere utilizzato nella struttura sopra per copiare ricorsivamente tutte le directory.

Se, come me, potresti dimenticarlo, allora prova:

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};

1
Aggiungi la configurazione "cwd" per impostare la directory di lavoro corrente.
Skarllot

3
Se baseti confonde ancora, dai un'occhiata a stackoverflow.com/a/35848322/11912 che fa un ottimo lavoro nel spiegarlo.
James Skemp,

60

Quindi - la soluzione di fornire una base funziona dato che tutti i percorsi hanno lo stesso percorso di base. Ma se vuoi fornire percorsi di base diversi, questo non funzionerà comunque.

Un modo in cui ho risolto questo problema è stato rendere relativo l'inizio del percorso. Per il tuo caso:

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

Il motivo per cui funziona è che Gulp imposta la base in modo che sia la fine del primo blocco esplicito - il primo * fa sì che imposti la base in CWD (che è il risultato che tutti noi desideriamo!)

Funziona solo se puoi assicurarti che la struttura delle cartelle non avrà determinati percorsi che potrebbero corrispondere due volte. Ad esempio, se avessi randomjs/allo stesso livello di js, finiresti per abbinare entrambi.

Questo è l'unico modo che ho trovato per includerli come parte di una funzione gulp.src di livello superiore. Sarebbe probabilmente semplice creare un plugin / funzione che potrebbe separare ciascuno di quei globs in modo da poter specificare la directory di base per loro, comunque.


Penso che dover iniziare con più percorsi di base probabilmente vada oltre lo scopo della domanda. Dalla mia domanda originale stavo spostando i file in un percorso assoluto, ma il problema si presentava ancora, senza specificare una base, tutti i file di tutti i miei globs venivano copiati in una singola directory senza che fosse seguita la loro gerarchia esistente.
M1ke

2
@ M1ke È vero, il punto principale della tua domanda non era diretto a percorsi base diversi. Tuttavia, hai menzionato However it flattens the dir structure - all directories are copied but every file is placed in the root /var/www, ed è proprio così che ho trovato la tua domanda: stavo cercando una soluzione su come copiare ricorsivamente con percorsi di base diversi. Fondamentalmente, questa soluzione funziona per il tuo caso senza dover specificare una base predefinita, ma anche per un caso con percorso multi-base, purché tu possa assicurarti che la stella principale non corrisponda a nulla :)
ty1824

6
Questa risposta è eccezionale. Si occupa in particolare di copiare un percorso da un punto di partenza arbitrario, ad es. src potrebbe essere 'assets/subdir/*fonts/*'quello di copiare la directory dei caratteri.
Wtower,

-4

Se vuoi copiare ricorsivamente l'intero contenuto di una cartella in un'altra cartella, puoi eseguire il seguente comando windows da gulp:

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

L' /yopzione alla fine è di sopprimere il messaggio di conferma della sovrascrittura.

In Linux, puoi eseguire il seguente comando da gulp:

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

puoi usare gulp-exec o gulp-run plugin per eseguire i comandi di sistema da gulp.

Link correlati:

  1. utilizzo xcopy

  2. gulp-exec e gulp-run


7
Il problema di tornare alla shell qui è che si perderebbe la possibilità di eseguire altri comandi sullo stream, come strumenti di compressione o di analisi.
M1ke
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.