web-dev-qa-db-fra.com

Comment copier des répertoires de manière récursive avec gulp?

J'essaye de placer un projet d'un répertoire de travail sur un serveur (même ordinateur). En utilisant le code suivant:

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));

Je m'attendrais à voir tous les fichiers copiés. Cependant, cela aplatit la structure du répertoire - tous les répertoires sont copiés mais chaque fichier est placé à la racine /var/www

Gulp semble être un excellent outil de création, mais la copie d’éléments devrait être un processus simple, à coup sûr?

157
M1ke

Il s'avère que pour copier une structure de répertoires complète, gulp doit être fourni avec une base pour votre méthode gulp.src().

Ainsi, gulp.src( [ files ], { "base" : "." }) peut être utilisé dans la structure ci-dessus pour copier tous les répertoires de manière récursive.

Si, comme moi, vous pouvez oublier ceci, alors essayez:

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};
165
M1ke

Ce qui suit fonctionne sans aplatir la structure de dossiers:

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));

Le '**/*' est la partie importante. Cette expression est un glob qui est un puissant outil de sélection de fichiers. Par exemple, pour copier uniquement les fichiers .js, utilisez: 'input/folder/**/*.js'

296
cancerbero

Donc, la solution consistant à fournir une base fonctionne, étant donné que tous les chemins ont le même chemin de base. Mais si vous voulez fournir différents chemins de base, cela ne fonctionnera toujours pas.

Une façon de résoudre ce problème a été de rendre relatif le début du chemin. Pour votre cas:

gulp.src([
    'index.php',
    '*css/**/*',
    '*js/**/*',
    '*src/**/*',
])
.pipe(gulp.dest('/var/www/'));

La raison pour laquelle cela fonctionne est que Gulp définit la base comme étant la fin du premier bloc explicite - le premier * le force à définir la base au niveau de la cwd (ce qui est le résultat que nous voulons tous!)

Cela ne fonctionne que si vous pouvez vous assurer que votre structure de dossiers n'aura pas certains chemins pouvant correspondre deux fois. Par exemple, si vous avez randomjs/ au même niveau que js, vous finirez par les faire correspondre.

C’est le seul moyen que j’ai trouvé d’inclure ces éléments dans le cadre d’une fonction gulp.src de niveau supérieur. Il serait probablement simple de créer un plugin/une fonction qui pourrait séparer chacun de ces globs afin que vous puissiez spécifier le répertoire de base pour eux, cependant.

55
ty1824