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?
3 answers
Mogę wymyślić dwa rozwiązania:
-
Dodaj opcję dla
base
do swojegogulp.src
tak:gulp.src([...files...], {base: './'}).pipe(...)...
To powie gulpowi, aby zachował całą ścieżkę względną. Następnie przekaż
'./'
dogulp.dest()
, aby zastąpić oryginalne pliki. (Uwaga: nie jest to testowane, upewnij się, że masz kopię zapasową na wypadek, gdyby nie działała.) -
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);
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)
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");
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