如何使用gulp递归复制目录?

M1k*_*1ke 161 deployment gulp

我正在尝试将项目从工作目录转移到服务器(同一台机器).使用以下代码:

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

我希望看到所有文件都被复制了.但它会使dir结构变平 - 所有目录都被复制,但每个文件都放在根目录中/var/www

Gulp看起来像一个伟大的构建工具,但复制项目肯定是一个简单的过程?

can*_*ero 305

以下工作没有展平文件夹结构:

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));
Run Code Online (Sandbox Code Playgroud)

'**/*'是重要的部分.该表达式是一个glob,它是一个功能强大的文件选择工具.例如,仅复制.js文件使用:'input/folder/**/*.js'

  • 如何使用特定的文件扩展名执行此操作? (3认同)
  • 这并不能完全回答被问到的问题.这是一个很好的解决方案,如何正确地复制递归,但它没有回答如何修改基目录. (3认同)
  • 以为你忘了添加gulp.dest.应该是``.pipe(gulp.dest('output/folder'));`` (2认同)
  • 您可以编辑答案以提供原始文件集的示例吗?我不确定这是 _more_ 合适,但我很乐意看看它与 `{base:"."}` 方法相比是如何工作的。 (2认同)
  • 重要的是要注意,`base`默认是这个答案中给出的"文件夹".换句话说,基数从glob模式开始的地方开始.这有助于我理解文件的最终位置,也是你不需要`gulp.dest`参数中的`**/*`的原因.Gulp接受glob中的所有内容并将其放在具有相同结构的dest文件夹中. (2认同)

M1k*_*1ke 167

事实证明,复制完整的目录结构gulp需要为您的gulp.src()方法提供一个基础.

因此gulp.src( [ files ], { "base" : "." })可以在上面的结构中使用递归复制所有目录.

如果像我一样,你可能会忘记这一点,那么试试:

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};
Run Code Online (Sandbox Code Playgroud)

  • 如果`base`仍然让您感到困惑,请查看/sf/answers/2509382571/,它可以很好地解释它. (3认同)

ty1*_*824 57

因此 - 假设所有路径具有相同的基本路径,则提供基础的解决方案.但是,如果您想提供不同的基本路径,这仍然无法正常工作.

我解决这个问题的一种方法是使路径的起点相对.对于你的情况:

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

这样做的原因是Gulp将基数设置为第一个显式块的结尾 - 前导*使它在cwd处设置基数(这是我们都想要的结果!)

这仅在您确保文件夹结构不具有可匹配两次的特定路径时才有效.例如,如果您randomjs/处于同一级别js,则最终会匹配两者.

这是我发现将这些作为顶级gulp.src函数的一部分包含在内的唯一方法.创建一个插件/函数可能很简单,可以将每个glob分开,以便为它们指定基本目录.

  • 这个答案很特别.它专门处理从任意起点复制路径,例如.src可以是`'assets/subdir/*fonts/*'`来复制字体dir. (5认同)
  • @ M1ke确实如此,你问题的主要观点并不针对不同的基本路径.但是,你提到`但它会使dir结构变平 - 所有目录都被复制,但每个文件都放在root/var/www`中,这实际上是我找到你的问题的方式 - 我正在寻找一个如何复制的解决方案递归地使用不同的基本路径.从本质上讲,此解决方案适用于您的情况,无需指定默认基础,也适用于多基路径情况,只要您可以确保前导星不匹配:) (2认同)