Czy Gulp może nadpisać wszystkie pliki src?

Załóżmy, że chcę Zastąpić numer wersji w kilku plikach, z których wiele znajduje się w podkatalogach. Prześlę pliki przez gulp-replace, aby uruchomić funkcję regex-replace; ale ostatecznie będę chciał zastąpić wszystkie oryginalne pliki.

Zadanie może wyglądać mniej więcej tak:

gulp.src([
    './bower.json',
    './package.json',
    './docs/content/data.yml',
    /* ...and so on... */
  ])
  .pipe(replace(/* ...replacement... */))
  .pipe(gulp.dest(/* I DONT KNOW */);

Więc jak Mogę to zakończyć tak, że każdy plik {[1] } po prostu nadpisuje się, w jego pierwotnej lokalizacji? Czy jest coś, co mogę przekazać gulp.dest(), co zrobi to?

Author: davidtheclark, 2014-03-15

3 answers

Mogę wymyślić dwa rozwiązania:

  1. Dodaj opcję dla base do swojego gulp.src tak:

    gulp.src([...files...], {base: './'}).pipe(...)...
    

    To powie gulpowi, aby zachował całą ścieżkę względną. Następnie przekaż './' do gulp.dest(), aby zastąpić oryginalne pliki. (Uwaga: nie jest to testowane, upewnij się, że masz kopię zapasową na wypadek, gdyby nie działała.)

  2. Użyj funkcji. Gulp to tylko JavaScript, więc możesz to zrobić:

    [...files...].forEach(function(file) {
        var path = require('path');
        gulp.src(file).pipe(rename(...)).pipe(gulp.dest(path.dirname(file)));
    }
    

    Jeśli trzeba je uruchomić asynchronicznie, pierwszy będzie o wiele łatwiejsze, ponieważ musisz użyć czegoś w rodzaju event-stream.merge i zmapować strumienie do tablicy. Wyglądałoby to tak:

    var es = require('event-stream');
    
    ...
    
    var streams = [...files...].map(function(file) {
            // the same function from above, with a return
            return gulp.src(file) ...
        };
    return es.merge.apply(es, streams);
    
 39
Author: OverZealous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-20 18:54:00

Powiedz gulpowi, aby zapisał do katalogu bazowego danego pliku, tak jak tak:

    .pipe(
        gulp.dest(function(data){

            console.log("Writing to directory: " + data.base);
            return data.base;
        })
    )

(argument danych to obiekt pliku winylowego )

Zaletą tego podejścia jest to, że jeśli masz pliki z wielu źródeł, każdy zagnieżdżony na różnych poziomach struktury plików, to podejście to pozwala na poprawne nadpisanie KAŻDEGO pliku. (Tak jak ustawiono jeden katalog bazowy w poprzedzającym łańcuchu rurowym)

 14
Author: Yiling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-03 18:04:56

Jeśli używasz gulp-rename, oto inne obejście:

var rename = require('gulp-rename');

...

function copyFile(source, target){
  gulp.src(source)
  .pipe(rename(target))
  .pipe(gulp.dest("./"));
}

copyFile("src/js/app.js","dist/js/app.js");

I jeśli chcesz, aby source i target były ścieżkami absolutnymi,

var rename = require('gulp-rename');

...

function copyFile(source, target){
  gulp.src(source.replace(__dirname,"."))
  .pipe(rename(target.replace(__dirname,".")))
  .pipe(gulp.dest("./"));
}

copyFile("/Users/me/Documents/Sites/app/src/js/app.js","/Users/me/Documents/Sites/app/dist/js/app.js");
 0
Author: danyamachine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-01 15:54:12