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

98

J'utilise actuellement gulp pour appeler un script bash qui nettoie mon dist/répertoire et déplace les fichiers appropriés vers le répertoire propre. J'aimerais que cela soit fait 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 dist/répertoire, mais lorsque j'essaye de déplacer les répertoires requis et leurs fichiers vers le dossier dist, les répertoires 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']);

l'appel gulp distentraîne le dist/remplissage du répertoire avec les répertoires corrects 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 dist/dossier?

Makenova
la source

Réponses:

162

Vous devez inclure l' baseoption src, qui conservera la structure du 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 allez probablement avoir des problèmes plus tard 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'y déplacer tous vos fichiers spécifiques à l'application. Cela facilite la maintenance et évite que vos fichiers spécifiques à la construction ne soient mélangés avec les fichiers spécifiques à votre application.

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

Trop zélé
la source
1
Cela a parfaitement fonctionné seulement après la réorganisation des fichiers, mais votre raisonnement est solide, donc je marque votre réponse comme correcte. Je vous remercie.
makenova
2
Pour faire le contraire, utilisez gulp-flatten. stackoverflow.com/questions/21153338/…
Tony Gutierrez
2
En guise de note pour quiconque a fait cela, assurez-vous que l' readoption dans src n'est pas définie sur false(elle est définie sur truepar défaut).
yndolok le
3
Quand je fais cela, il copie avec tous les répertoires racine.
Nomadme
5

La question d'origine ne cible que les répertoires (aka dossiers) dans son gulp.src, c'est- gulp.src(['_locales', ...à- dire dans cet exemple, _localesest le nom d'un répertoire .

La réponse acceptée utilise un globmodèle dans ses fichiersgulp.src cibles n'importe où dans ces répertoires, c'est -à- dire (notez les astérisques doubles et les astérisques filename.extension ). La réponse acceptée fonctionne ...gulp.src(['./_locales/**/*.*', ...

... mais la réponse acceptée ne fait que souligner l' baseoption :

Vous devez inclure l' baseoption src ...

J'ai expérimenté et trouvé:

  1. Strictement parlant, il n'est pas nécessaire d'utiliser l' baseoption pour réaliser ce que l'OP a demandé: "... et déplace les fichiers appropriés vers le répertoire propre." L' baseoption de ne conserve en effet le fichier dossier + la structure (comme décrit dans la réponse acceptée), mais l' baseoption est insuffisante pour déplacer les fichiers que l'OP a demandé . Préserver la structure dossier + fichier est probablement ce que l'OP attend , donc la réponse acceptée est bonne, mais ...

  2. Juste pour réitérer ce qui déplace les fichiers, ce sont les globmodèles:

    1. Double-astérisque ( .../**/...) recherche de manière récursive dans tous les sous-dossiers, les sous-dossiers des sous-dossiers, etc.

    2. Filename.extension astérisques ( .../*.*) trouve les fichiers de tous les noms et de toutes les extensions . Je pense donc que cette partie mérite le plus d’accent!

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

Faites-moi savoir si je me trompe ...

Le pois rouge
la source