web-dev-qa-db-fra.com

Utilisez gulp pour sélectionner et déplacer des répertoires et leurs fichiers

J'utilise actuellement gulp pour appeler un script bash qui nettoie mon répertoire dist/ Et déplace les fichiers appropriés dans le répertoire clean. Je voudrais que cela se fasse avec gulp car je ne suis pas sûr que le script fonctionnerait sur un système de fichiers non * nix.
Jusqu'à présent, j'utilise le module gulp-clean pour nettoyer le répertoire dist/, Mais lorsque j'essaie de déplacer les répertoires requis et leurs fichiers dans le dossier dist, ceux-ci sont vides.

var gulp = require('gulp'),
    clean = require('gulp-clean');

gulp.task('clean', function(){
  return gulp.src(['dist/*'], {read:false})
  .pipe(clean());
});

gulp.task('move',['clean'], function(){
  gulp.src(['_locales', 'icons', 'src/page_action', 'manifest.json'])
  .pipe(gulp.dest('dist'));
});

gulp.task('dist', ['move']);

en appelant gulp dist, le répertoire dist/ est rempli avec les répertoires appropriés, mais ils sont tous vides.

$ ls dist/*
dist/manifest.json

dist/_locales:

dist/icons:

dist/page_action:

Comment copier les répertoires et leur contenu dans le dossier dist/?

96
makenova

Vous devez inclure l'option base à src, qui préservera la structure de fichier comme vous le souhaitez:

var filesToMove = [
        './_locales/**/*.*',
        './icons/**/*.*',
        './src/page_action/**/*.*',
        './manifest.json'
    ];

gulp.task('move',['clean'], function(){
  // the base option sets the relative root for the set of files,
  // preserving the folder structure
  gulp.src(filesToMove, { base: './' })
  .pipe(gulp.dest('dist'));
});

En outre, vous aurez probablement des problèmes sur la route si vous avez tous ces fichiers sources à la racine de votre projet.

Si vous le pouvez, je vous recommande d'utiliser un seul src/ dossier et déplacez tous vos fichiers spécifiques à l’application. Cela facilite la maintenance et empêche vos fichiers spécifiques à la construction de se mélanger à ceux de votre application.

Si vous faites cela, alors remplacez simplement toutes les occurrences de ./ avec src/ dans l'exemple ci-dessus.

158
OverZealous

La question d'origine cible uniquement les répertoires (dossiers a.k.a.) de son répertoire gulp.src, c'est à dire. gulp.src(['_locales', ... dans cet exemple, _locales est le nom d’un répertoire .

La réponse acceptée utilise un motif glob dans son gulp.src pour cibler les fichiers n’importe où dans ces répertoires, c.-à-d. gulp.src(['./_locales/**/*.*', ..., (notez les doubles astérisques, et les nomfichier.extension astérisques). La réponse acceptée fonctionne ...

... mais la réponse acceptée ne met que l'accent sur l'option base:

Vous devez inclure l'option base à src ...

J'ai expérimenté et trouvé:

  1. Strictement parlant, il n’est pas nécessaire d’utiliser l’option base pour obtenir ce que le PO a demandé: "... et déplace les fichiers appropriés dans le répertoire clean. " La base option fait préserve bien la structure dossier + fichier (comme décrit dans la réponse acceptée), mais l'option base est non suffisante pour déplacer les fichiers en tant que OP demandé . Préserver la structure du dossier + fichier correspond probablement à ce que l'OP attend , donc la réponse acceptée est bonne, mais ...

  2. Juste pour répéter ce que fait déplace les fichiers, ce sont les patterns glob:

    1. Double astérisque (.../**/...) effectue une recherche récursive dans tous les sous-dossiers et sous-dossiers "sous-dossiers", etc.

    2. Nom de fichier.extension astérisques (.../*.*) trouve des fichiers de tous noms, et de tous extensions. Je pense donc que cette partie mérite le plus d'emphase!

  3. La réponse acceptée change quelque chose d'autre; il ajoute un préfixe de ./ à chaque chemin des arguments passés à gulp.src. Je pense que c'est inutile/redondant; si il n'y a pas ./, (comme dans la question OP), les chemins sont résolus par rapport au répertoire actuel - entraînant le même comportement. Mais c'est peut-être une bonne pratique d'être explicite avec le ./

Faites-moi savoir si je me trompe ...

5
The Red Pea