Copia tutti i file da una directory a un'altra con la copia di Grunt.js.


91

Sto cercando di 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 ho specificato esplicitamente ma quando provo a copiare l'intera directory fa cose strane come copia l'intera struttura della directory (o niente). Ecco la parte rilevante dal mio GruntFile.js:

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/" }
    ]
  }
},

Nello specifico è l'ultima riga che non riesco a far funzionare:

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

Risposte:


149

L' flatten: trueopzione come in questa risposta potrebbe funzionare per alcuni casi, ma mi sembra che il requisito più comune (come nel mio caso) sia copiare una cartella e la sua struttura di sottocartelle, così com'è, in dest. Sembra che nella maggior parte dei casi, se si dispone di sottocartelle, è probabile che venga fatto riferimento in questo modo nel codice. La chiave per farlo è l' cwdopzione, che manterrà la struttura delle cartelle relativa alla directory di lavoro specificata:

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
  }
}

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

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

2
Ho dovuto assicurarmi che i percorsi delle directory terminassero con "/" e aggiungere flatten: falseper farlo funzionare.
Samuel Rossille

**/* Questo è quello che stavo cercando, stavo usando ** grazie amico.
Sam

43

Questa attività manterrà la struttura delle cartelle se si specifica un file glob. Quello che vuoi è l' flattenopzione che rimuoverà la struttura.

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

Trova il resto delle opzioni disponibili nel repository Github . Spero che questo ti aiuti.


24

Vorrei aggiungere che cambiando il formato del glob in src modificherà il funzionamento della copia.

Come sottolineato da bmoeskau sopra, quanto segue copierà tutto all'interno dist/e lo sposterà in path/to/dir(sovrascrivendo la destinazione se esiste già).

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

Notare tuttavia che:

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

Copierà solo i file all'interno dist/e le directory, ma non copierà il contenuto di tali directory nella destinazione.

Inoltre, il seguente con src: '*/*'sarà solo copiare le directory con i contenuti all'interno dist/. Cioè, i file appena all'interno dist/non verranno copiati.

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

Infine, come sopra, ma src: '**/**'copierà solo i file all'interno dist/così come i file all'interno delle dist/sottodirectory in 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
miocodice

3
meglio della documentazione su GitHub, mi piacciono gli esempi
wukong

+1 Esiste una convenzione su cosa dovrebbe significare il numero di stelle, ad esempio significa **sempre file e directory e *solo file?
CodyBugstein

1
@Imray Dal manuale di bash : due adiacenti *usati come un unico modello corrisponderanno a tutti i file e zero o più directory e sottodirectory . Se seguito da a /, due *s adiacenti corrisponderanno solo a directory e sottodirectory .
Jorge Bucaran

1
**corrisponde a tutto , mentre **/ solo directory e sottodirectory (non file).
Jorge Bucaran

1

Ho dovuto usare egdy invece parentesi graffe per il segmento dei file (in Coffeescript) ...

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

0

Se stai sviluppando con yeoman angolare, allora questo è il modo migliore per copiare con grugnito. expand: true è richiesto quando si usa cwd. <% = yeoman.app%> è solo la route dell'app (".").

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

Sebbene questo snippet di codice possa risolvere la domanda, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Si prega inoltre di cercare di non riempire il codice con commenti esplicativi, poiché ciò riduce la leggibilità sia del codice che delle spiegazioni!
Arrivederci StackExchange
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.