Modifica il file sul posto (stessa destinazione) utilizzando Gulp.js e uno schema di globbing


99

Ho un'attività gulp che sta tentando di convertire i file .scss in file .css (usando gulp-ruby-sass) e quindi posiziona il file .css risultante nello stesso posto in cui ha trovato il file originale. Il problema è che, poiché sto usando un pattern globbing, non so necessariamente dove è archiviato il file originale.

Nel codice seguente sto cercando di utilizzare gulp-tap per entrare nel flusso e capire il percorso del file corrente da cui è stato letto il flusso:

gulp.task('convertSass', function() {
    var fileLocation = "";
    gulp.src("sass/**/*.scss")
        .pipe(sass())
        .pipe(tap(function(file,t){
            fileLocation = path.dirname(file.path);
            console.log(fileLocation);
        }))
        .pipe(gulp.dest(fileLocation));
});

Sulla base dell'output di console.log(fileLocation), questo codice sembra che dovrebbe funzionare bene. Tuttavia, i file CSS risultanti sembrano essere posizionati una directory più in alto di quanto mi aspettassi. Dove dovrebbe essere project/sass/partials, il percorso del file risultante è solo project/partials.

Se esiste un modo molto più semplice per farlo, apprezzerei sicuramente ancora di più quella soluzione. Grazie!

Risposte:


155

Come sospettavi, lo stai rendendo troppo complicato. La destinazione non deve essere dinamica poiché anche il percorso globbed viene utilizzato dest. Semplicemente reindirizza alla stessa directory di base da cui stai scaricando src, in questo caso "sass":

gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest("sass"));

Se i tuoi file non hanno una base comune e devi passare un array di percorsi, questo non è più sufficiente. In questo caso, vorresti specificare l'opzione di base.

var paths = [
  "sass/**/*.scss", 
  "vendor/sass/**/*.scss"
];
gulp.src(paths, {base: "./"})
  .pipe(sass())
  .pipe(gulp.dest("./"));

Ah, fantastico. Grazie. C'è anche un modo semplice per usare un glob per il sorgente, ma metti tutto direttamente nella sasscartella?
Dan-Nolan

2
Questo non ha funzionato per me. Ho dovuto fare gulp.src("dist/**/*")...gulp.dest("./")
niftygrifty

@ Dan-Nolan un modo per appiattire la struttura delle cartelle sembra utilizzare gulp-rename , vedere questa domanda
numbers1311407

@niftygrifty Secondo la documentazione che deve lavorare in una situazione normale. I file vengono scritti nel percorso globbed corrispondente rispetto a una base relativa calcolata , in questo caso sass. Forse il plugin sass qui sta già modificando i percorsi?
numeri 1311407

1
Ma questo non salva il file in / sass e non nella relativa sottodirectory come / sass / any / where? Come faccio a salvare i file nel percorso globbed?
Mark

68

Questo è più semplice dei numeri su cui ha portato 1311407. Non è necessario specificare affatto la cartella di destinazione, è sufficiente utilizzare .. Inoltre, assicurati di impostare la directory di base.

gulp.src("sass/**/*.scss", { base: "./" })
    .pipe(sass())
    .pipe(gulp.dest("."));

8
Questa è la risposta esatta. Se stai cercando di preservare la struttura di destinazione (cioè, non appiattire la struttura), devi indicare la directory di base in gulp.src.
Gui Ambros

2
Quando provo questo, i file vengono salvati in "/" e non nel percorso globbed.
Mark

1
Quello che dice @GuiAmbros non è vero, almeno non secondo i documenti . La base, per impostazione predefinita, è calcolata come tutto prima del percorso globbed. Nella mia risposta la base verrebbe calcolata essere ./sass, ma la domanda specifica che l'output mantiene la sassdirectory, motivo per cui viene ripetuta in dest. Questa risposta ottiene lo stesso risultato utilizzando l'opzione di base, ma nessuno dei due approcci è sbagliato.
numeri 1311407

È anche degno di nota il fatto che la situazione dell'OP probabilmente non è così comune, almeno per l'elaborazione CSS, poiché in genere ci si aspetterebbe di esportare in una cssdirectory o simile, non da sassa sass. In questi casi la risposta accettata è in realtà più semplice di questa alternativa.
numeri 1311407

30
gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest(function(file) {
    return file.base;
  }));

Risposta originariamente fornita qui: https://stackoverflow.com/a/29817916/3834540 .

So che questo thread è vecchio ma appare ancora come il primo risultato su Google, quindi ho pensato che avrei potuto pubblicare il link qui.


Questo thread è vecchio ma le risposte sono ancora corrette, anche se suppongo che questo metodo sia leggermente più ASCIUTTO (se leggermente meno efficiente). La domanda collegata, in realtà, era un problema di utilizzo desterrato. Sicuramente le soluzioni fornite funzionano, ma farlo bene la prima volta, semplicemente sostituendolo dest('./')con dest('./images'), avrebbe ottenuto lo stesso risultato.
numeri 1311407

Il motivo per cui l'altra soluzione non ha funzionato per me era che avevo un array all'interno di gulp.src () ad es. Gulp.src (['sass / **', 'common / sass / **']) e quando ho cercato la risposta, questo è stato il post che ho trovato. Probabilmente avrebbe dovuto
renderlo

Ha senso. Nel tuo caso il problema è che non esiste una base comune per il calcolo di gulp. La tua soluzione funziona, ma anche la soluzione fornita da @ NightOwl888 per specificare la base avrebbe funzionato. Aggiornamento della risposta accettata per includere il caso di non avere una base comune.
numeri 1311407

Questa dovrebbe essere la risposta accettata! Non gli altri, che sono specifici di un solo file o di un percorso di base.
MrCroft

0

Questo è stato molto utile!

gulp.task("default", function(){

    //sass
    gulp.watch([srcPath + '.scss', '!'+ srcPath +'min.scss']).on("change", function(file) {
         console.log("Compiling SASS File: " + file.path)
         return gulp.src(file.path, { base: "./" })
        .pipe(sass({style: 'compressed'}))
        .pipe(rename({suffix: '.min'}))
        .pipe(sourcemaps.init())
        .pipe(autoprefixer({
            browsers: ['last 2 versions'],
            cascade: false
        }))
        .pipe(sourcemaps.write('./'))         
        .pipe(gulp.dest(".")); 
    });

    //scripts
    gulp.watch([srcPath + '.js','!'+ srcPath + 'min.js']).on("change", function(file) {
        console.log("Compiling JS File: " + file.path)
        gulp.src(file.path, { base: "./" })
        .pipe(uglify())
        .pipe(rename({suffix: '.min'}))       
        .pipe(gulp.dest(".")); 
    });
})
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.