2013-09-23 2 views
84

Sto provando a copiare tutti i file in una directory in un'altra directory come parte del mio processo di compilazione. Funziona bene per i singoli file che specifichi esplicitamente, ma quando provo a copiare l'intera directory fa cose strane come copia l'intera struttura della directory (o niente del tutto). Ecco la parte rilevante dai miei GruntFile.js:Copia tutti i file dalla directory a un'altra con Grunt.js copia

copy: { 
    myvoice: { 
    files: [ 
     { src:"src/html/index.html", dest:"dist/myvoice/index.html" }, 
     { src:"src/html/css/style.css", dest:"dist/myvoice/css/style.css" }, 
     { src:"src/html/js/require.js", dest:"dist/myvoice/js/require.js" }, 
     { src:"build/myvoice/main.js", dest:"dist/myvoice/js/main.js" }, 
     { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" } 
    ] 
    } 
}, 

In particolare è l'ultima riga che non posso andare al lavoro:

 { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" } 

risposta

138

L'opzione flatten: true come in this answer potrebbe funzionare per alcuni casi, ma mi sembra che il requisito più comune (come nel mio caso), è quello di copiare una cartella e la sua struttura sottocartella, così com'è, a dest . Sembra che nella maggior parte dei casi se si dispone di sottocartelle, verrà probabilmente fatto riferimento in quel modo nel codice. La chiave per fare questo è l'opzione cwd, che manterrà la struttura della cartella relativa alla directory di lavoro specificato:

copy: { 
    files: { 
    cwd: 'path/to/files', // set working folder/root to copy 
    src: '**/*',   // copy all files and subfolders 
    dest: 'dist/files', // destination folder 
    expand: true   // required when using cwd 
    } 
} 
+0

Grazie - hai ragione, questa risposta è più quella che stavo cercando quando ho posto la domanda. Avevo imparato a gestire l'appiattimento causato dalla risposta precedente ma era fastidioso. –

+12

Ho perso più di un'ora per questo ... Se usi le opzioni di 'cwd', ​​assicurati di girare' expand: true'. Se non imposti 'expand: true', cwd non funzionerà correttamente. – ducin

+2

Ho dovuto accertarmi che i percorsi delle directory terminassero con "/" e aggiungo "flatten: false" per farlo funzionare. –

42

Questo compito sarà mantenere la struttura delle cartelle se si specifica un file glob. Quello che vuoi è l'opzione flatten che rimuoverà la struttura.

{ 
    expand: true, 
    flatten: true, 
    src: ['src/html/css/fonts/**'], 
    dest: 'dist/myvoice/css/fonts/', 
    filter: 'isFile' 
} 

trovare il resto delle opzioni disponibili nel Github repo. Spero che questo ti aiuti.

22

Vorrei aggiungere che la modifica del formato del glob in src modificherà come la copia lavori.

Come rilevato dalla bmoeskau sopra, la seguente copierà tutto all'interno dist/ e spostarlo path/to/dir (sovrascrivendo la destinazione se esiste già).

copy: { 
    files: { 
    expand: true, 
    dest: 'path/to/dir', 
    cwd: 'dist/', 
    src: '**' 
    } 
} 

Nota però che:

copy: { 
    files: { 
    expand: true, 
    dest: 'path/to/dir', 
    cwd: 'dist/', 
    src: '*' 
    } 
} 

sarà solo copiare i file all'interno dist/ così come le directory, ma non saràcopiare il contenuto di queste directory alla destinazione.

Inoltre, il seguente con src: '*/*' volontà solo directory di copia con contenuto all'interno dist/. Cioè, i file appena all'interno di dist/ non verranno copiati.

copy: { 
    files: { 
    expand: true, 
    dest: 'path/to/dir', 
    cwd: 'dist/', 
    src: '*/*' 
    } 
} 

Infine, come sopra, ma src: '**/**' copierà solo file all'interno dist/ così come file all'interno dist/ sottodirectory path/to/dir. Quindi non ci saranno cartelle all'interno della destinazione.

copy: { 
    files: { 
    expand: true, 
    dest: 'path/to/dir', 
    cwd: 'dist/', 
    src: '*/*', 
    flatten: true, 
    filter: 'isFile' 
    } 
} 
+4

grande spiegazione! +1 – myrocode

+2

migliore della documentazione su github, mi piacciono gli esempi – wukong

+0

+1 C'è una convenzione su cosa dovrebbe significare il numero di stelle, per esempio "**" significa sempre file e directory e "*" solo file? – CodyBugstein

0

Ha dovuto utilizzare le parentesi graffe invece per il segmento di file (in Coffeescript) ...

0

Se si sta sviluppando con yeoman angolare, questo è il modo migliore per copiare con grugnito. espandi: true è richiesto quando si usa cwd. <% = yeoman.app%> è solo il percorso delle app ('.').

{ 
    expand: true, 
    cwd: '<%= yeoman.app %>/data', 
    dest: '<%= yeoman.dist %>/data', 
    src: ['**'] 
    } 
+0

Anche se questo snippet di codice può risolvere la domanda, [compresa una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-entually-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. Cerca anche di non affollare il tuo codice con commenti esplicativi, in quanto ciò riduce la leggibilità sia del codice che delle spiegazioni! – FrankerZ

Problemi correlati