web-dev-qa-db-fra.com

Gulp peut-il écraser tous les fichiers src?

Disons que je veux remplacer le numéro de version dans un tas de fichiers, dont beaucoup vivent dans des sous-répertoires. Je vais diriger les fichiers via gulp-replace pour exécuter la fonction regex-replace; mais je vais finalement vouloir écraser tous les fichiers originaux .

La tâche pourrait ressembler à ceci:

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

Alors, comment puis-je y mettre fin de sorte que chaque fichier src se remplace simplement, à son emplacement d'origine? Y a-t-il quelque chose que je peux transmettre à gulp.dest() qui fera cela?

30
davidtheclark

Je peux penser à deux solutions:

  1. Ajoutez une option pour base à votre gulp.src Comme ceci:

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

    Cela indiquera à gulp de conserver l'intégralité du chemin relatif. Ensuite, passez './' Dans gulp.dest() pour écraser les fichiers originaux. (Remarque: ceci n'est pas testé, vous devez vous assurer d'avoir une sauvegarde au cas où cela ne fonctionnerait pas.)

  2. Utilisez des fonctions. Gulp est juste JavaScript, vous pouvez donc le faire:

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

    Si vous devez les exécuter de manière asynchrone, la première sera beaucoup plus facile, car vous devrez utiliser quelque chose comme event-stream.merge Et mapper les flux dans un tableau. Cela ressemblerait à

    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
OverZealous

Dites à gulp d'écrire dans le répertoire de base du fichier en question, comme ceci:

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

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

(L'argument de données est n objet de fichier vinyle )

L'avantage de cette approche est que si vous avez des fichiers de plusieurs sources imbriqués chacun à différents niveaux de la structure de fichiers, cette approche vous permet d'écraser correctement chaque fichier. (Comme indiqué pour définir un répertoire de base en amont de votre chaîne de tuyaux)

14
Yiling

Je ne sais pas pourquoi les gens le compliquent, mais en commençant simplement votre chemin de destination avec "./" Fait le travail.

Dites que le chemin est 'dist/css' Ensuite, vous l'utiliseriez comme ceci .pipe(gulp.dest("./dist/css"));

Ça y est, j'utilise cette approche sur chacun de mes projets.

0
Mosia Thabo

si vous utilisez gulp-rename, voici une autre solution:

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");

et si vous voulez que la source et la cible soient des chemins absolus,

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
danyamachine