使用gulp选择和移动目录及其文件

101

目前我正在使用gulp调用一个bash脚本来清理dist/目录并将适当的文件移动到该干净的目录中。我希望使用gulp来完成此操作,因为我不确定该脚本是否适用于非*nix文件系统。
到目前为止,我使用gulp-clean模块清理dist/目录,但是当我尝试将所需的目录及其文件移动到dist文件夹时,这些目录是空的。

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']);

运行 gulp dist 命令将会在 dist/ 目录下生成正确的文件夹结构,但它们都是空的。

$ ls dist/*
dist/manifest.json

dist/_locales:

dist/icons:

dist/page_action:

我该如何将目录及其内容复制到dist/文件夹中?

2个回答

168

您需要在src中包含base选项,这将保留文件结构,使其按照您的意愿进行:

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'));
});

此外,如果您将所有这些源文件放在项目的根目录中,您可能会在今后遇到麻烦。

如果可能的话,我建议您使用一个单独的src/文件夹,并将所有与应用程序相关的文件都移动到该文件夹中。这样可以更轻松地进行维护,并防止您的构建特定文件与应用程序特定文件混淆。

如果您这样做了,在上面的示例中,只需将所有出现的./替换为src/即可。


1
重新组织文件后,它完美地工作了,但你的推理是正确的,所以我将你的答案标记为正确。谢谢。 - makenova
2
要执行相反的操作,请使用gulp-flatten。https://dev59.com/4GEi5IYBdhLWcg3wlc9u?rq=1 - Tony Gutierrez
2
对于其他人的提示,确保您的src中的“read”选项未设置为“false”(默认情况下设置为“true”)。 - yndolok
4
当我这样做时,它会复制整个根目录。 - Ganbayar Gansukh

6
原问题仅针对目录(即文件夹)进行了gulp.src,例如:gulp.src(['_locales', ...中,_locales是一个目录的名称。
接受的答案在其gulp.src中使用glob模式来定位这些目录中任何位置的文件,即:gulp.src(['./_locales/**/*.*', ...,(注意双星号文件名.扩展名星号)。 接受的答案可以正常工作...
...但是接受的答案只强调了base选项:

您需要包括base选项...

我做了实验并发现:
  1. 严格来说,使用base选项是不必要的,以实现OP所要求的内容:“...并将相应的文件移动到干净的目录。” base选项确实保留了文件夹+文件结构(如接受的答案中所述),但是base选项不足以按照OP所要求的那样移动文件。保留文件夹+文件结构可能是OP所期望的,因此接受的答案很好,但是...

  2. 再次强调可以移动文件的是glob模式:

    1. 双星号(.../**/...)在所有子文件夹、子文件夹的子文件夹等中进行递归搜索。

    2. 文件名.扩展名星号(.../*.*)查找所有名称和所有扩展名的文件因此,我认为这部分最值得强调!

  3. 接受的答案还更改了其他内容;它向传递给gulp.src的每个路径参数添加了一个前缀./。我认为这是不必要的/冗余的;如果没有./(如在OP问题中),则路径相对于当前目录解析--导致相同的行为。但是也许明确使用./是个好习惯。

如果我说错了,请告诉我...

1
谢谢您的解释。我不需要base选项,但是我需要像您描述的那样精确地指定*.*才能移动正确的文件。+1 - Uche Ozoemena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接