2015-07-09 17 views
8

La mia domanda inizia con un altro, ha chiesto qui: Gulp: How to set dest folder relative to processed file (when using wildcards)?Spiegazione di percorsi di nodi rispetto al gulp .pipe()

Ho una situazione simile, in cui ho bisogno di fare versioni compresse in una base per modulo. Cioè, ho

ui/test/one/script1.js 
ui/test/two/script2.js 

e ho bisogno di avere sorso copiare i file nelle directory relative così finisco con

ui/test/one/compressed/script1.js 
ui/test/two/compressed/script2.js 

Ho la seguente attività sorso

gulp.task('test', function() { 
    return gulp.src('ui/test/**/*.js') 
     .pipe(gulp.dest(function(file) { 
      return path.join(path.dirname(file.path), 'compressed'); 
     })); 
}); 

Tuttavia , quando lo eseguo, finisco con

ui/test/one/compressed/one/script1.js 
ui/test/two/compressed/two/script2.js 

Vedo nel docs in cui si dice

CWD - Specificare la directory di lavoro la cartella è relativa a. base - Specifica la cartella relativa al cwd. L'impostazione predefinita è dove inizia il glob. Questo è usato per determinare i nomi di file da salvare in .dest()

Ho molte domande, in particolare su .src(), .dest() e il percorso e l'oggetti. (Cioè, sebbene sia Sono sicuro che ci sono altri modi per raggiungere il mio obiettivo finale, questa domanda riguarda specificamente il comportamento del codice gulp di esempio sopra e le funzioni menzionate in modo da comprendere meglio il loro comportamento e le API)

Domande

  • Quando i documenti dicono che "la directory di lavoro la cartella è relativa a", quale cartella è questo?
  • in quella stessa nota, in relazione a this comment e lo spot nei documenti dove si dice "base - Specificare la cartella relativa al cwd. L'impostazione predefinita è dove inizia il glob" che cosa significa "dove inizia il glob" significa? La mia comprensione di "glob" è che è l'intera stringa, ma in realtà significa un carattere * all'interno di quella stringa? Quindi per "alcuni/cartella/**/*. Js" con un file esistente a some/folder/a/b/c/foo.js non sono sicuro che la base sia some/folder/, some/folder/a/ o some/folder/a/b/c/?
  • c'è un modo per dire <where the glob begins> + '..'?
  • dove sto dicendo path.join (path.dirname (file.path), 'compresso') presumo che stia producendo C:\blah\ui\test\one\compressed. Ne consegue che qualunque cosa sia stata decisa, il nome effettivo del file ha in mente one\script1.js. Come faccio a cambiare idea in modo che pensi solo a script1.js?

Nota: Ho provato a fare quanto segue (utilizzando gulp-debug)

gulp.task('test', function() { 
    return gulp.src('ui/test/**/*.js', {cwd: './'}) 
     .pipe(debug({minimal: false})) 
     .pipe(rename(function(path) { 
      path.basename =  path.basename.substring(path.basename.lastIndexOf('\\') + 1); 
     })) 
     .pipe(debug({minimal: false})) 
     .pipe(gulp.dest(function(file) { 
      return path.join(path.dirname(file.path), 'compressed'); 
     })); 
}); 

La console è il seguente output per questa versione del compito:

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\one\script1.js 

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\one\script1.js 

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\two\script2.js 

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\two\script2.js 

Così sembra che la rinomina non ha alcun effetto sul percorso. Ho anche provato a modificare il percorso.dirname nella pipe rename, ma non è riuscito a trovare nulla che avrebbe l'effetto desiderato di rimuovere semplicemente il nome della directory spuria dal percorso di output finale.

La mia ultima domanda, quindi, è cosa esattamente path.basename e path.dirname contengono per l'oggetto percorso passato alla funzione rename?

modifica: Ho trovato this su come eseguire il debug di attività gulp. In questo modo con un debugger; dichiarazione collocato nella funzione di ridenominazione mi ha permesso di ispezionare l'oggetto tracciato, che assomiglia a questo:

{ 
    basename: "script1", 
    dirname: "one", 
    extname: ".js" 
} 

Impostazione path.dirname per '' nei risultati Rinomina

ui/test/compressed/script1.js 
ui/test/compressed/script2.js 

così potrebbe essere che rename() stesso non sia utile per ciò di cui ho bisogno. Sembra più che l'opzione di base di .src() possa essere dove si trova la chiave, ma i documenti sono piuttosto concisi.

+0

Sembra che tu abbia trovato un modo per modificare il percorso nel modo in cui ti serve nell'ultimo '.pipe', quindi qual è la domanda? Perché gulp non consente uno scenario non standard fuori dalla scatola? –

+0

@KirillSlatin Finisco con 'ui/test/one/compressed/one/script1.js' dove quello di cui ho bisogno è' ui/test/one/compresso/script1.js'. Quel secondo '/ one' è ciò che voglio evitare. Ho modificato questa ricetta https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-task-steps-per-folder.md ed è stata in grado di ottenere ciò di cui ho bisogno, quindi se la taglia scade e nessun altro si preoccupa di reclamarlo rispondendo, quindi pubblicherò una risposta con quello che ho trovato. Ho finito per usare un hash nel rinominare, che era proprio quello di cui avevo bisogno. – jinglesthula

+0

Devo notare che il mio commento precedente è relativo al risultato finale e non alle domande effettive su .src() e .dest() e su come i percorsi di handle che stavo effettivamente chiedendo qui. Quindi, posterò quello che ho trovato sull'altra domanda che in realtà è la risposta a :) – jinglesthula

risposta

5

Domanda 1:

gulp.src('ui/test/**/*.js') 

Questa linea è l'impostazione '/ ui/test /' come directory principale ('directory di file di lavoro'), in quanto è la base del vostro modello di glob. Ecco perché i "percorsi relativi" inviati a dest erano "one/script1.js" e "two/script2.js".

Domanda 2:

Con glob, i documenti vengono riferisce al vostro '**/* js.' Modello. Quindi la base del tuo glob è la stessa cosa che usa come directory root, '/ ui/test /', che in questo caso significa le stesse cose di "cartella relativa al cwd".

Domanda 3:

La proprietà 'base' per ogni percorso viene impostata simile al modulo glob2base per ogni file proveniente dal flusso gulp.src.

glob2base(new glob.Glob('/ui/test/**/*.js')) + '..'; 

è lo stesso di

file.base + '..'; 

se questo ha un senso per voi.

Domanda 4:

presumo che si sta utilizzando gulp-rename nella seconda sezione del codice. Quindi questo dovrebbe risolvere il tuo problema.

gulp.src('ui/test/**/*.js') 
    .pipe(rename(function(path){ 
     path.basename = 'compressed/' + path.basename; 
    }) 
    .pipe(gulp.dest(function(file) { 
     return file.base; 
    })); 

Le altre opzioni che possono essere passati al gulp.src si trovano here, ma non credo che nessuno di loro risolvere direttamente quello che stai cercando di fare. gulp.src non sembra aspettarsi che tu abbia hackerato una nuova directory nel mezzo di ogni percorso, quindi la rinomina è la soluzione più semplice.

Non ti biasimo per avere problemi a capire i documenti. Ho dovuto saltare tra tre o quattro diverse pagine github per mettere insieme tutto quello che succedeva. Spero tu abbia imparato tanto quanto ho fatto da questo.

Problemi correlati