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


167

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

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

我希望看到所有文件被复制。但是它使目录结构平坦化-复制所有目录,但每个文件都放在根目录中/var/www

Gulp似乎是一个很棒的构建工具,但是复制项目肯定是一个简单的过程吗?


9
对于任何阅读此问题的新读者来说,应该注意的是,投票率最高的答案无法解决原始的不扁平化目录问题。它解决了人们与不是所有的文件有问题的内部被复制的目录,所以这是有用的!
M1ke 2015年

1
通过不拼合,是否表示要在其中显示“ css”,“ js”和“ src”目录/var/www/?您可以尝试{css,js,src}/**/*
Jason Goemaat,

我知道glob扩展确实在gulp中起作用,但是如果它对于列表中的单个行与每个项目的工作方式不同,我会感到困惑-因为glob扩展基本上只是打算在执行之前扩展到列表。
M1ke '16

Answers:


319

下面的工作无需展平文件夹结构:

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

'**/*'是重要的组成部分。那表情是水珠这是一个功能强大的文件选择工具。例如,仅复制.js文件,请使用:'input/folder/**/*.js'


2
以为您忘记添加gulp.dest。应该是.pipe(gulp.dest('output/folder'));
Matthew Sprankle 2014年

3
如何使用特定的文件扩展名呢?
Chev

1
您可以编辑答案以提供原始文件集的示例吗?我不确定这是否合适,但与该{base:"."}方法相比,我很高兴了解它的工作原理。
M1ke 2015年

2
重要的是要注意,base此答案中给出的默认值为“文件夹”。换句话说,基点从球形模式开始的地方开始。这帮助我了解了文件的最终位置,这也是为什么您不需要**/*in gulp.dest参数的原因。Gulp将所有内容放入glob,并将其放入具有相同结构的dest文件夹中。
尼尔·梦露

3
这不能完全回答所问的问题。对于如何正确地递归复制,这是一个很好的解决方案,但它没有回答如何修改基本目录。
ty1824 '10 / 10/1

173

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

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

如果像我一样,您可能忘记了这一点,请尝试:

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

1
添加“ cwd”配置以设置当前工作目录。
Skarllot '16

3
如果base仍然让您感到困惑,请查看stackoverflow.com/a/35848322/11912,它对解释它很有帮助。
James Skemp

60

因此,鉴于所有路径都具有相同的基本路径,提供基本功能的解决方案。但是,如果您想提供不同的基本路径,则仍然无法使用。

解决此问题的一种方法是使路径的开头相对。对于您的情况:

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

之所以起作用,是因为Gulp将基数设置为第一个显式块的结尾-前导*使其将基数设置为cwd(这是我们所有人想要的结果!)

仅当您可以确保文件夹结构没有某些路径可以匹配两次时,此方法才有效。例如,如果您randomjs/的级别与相同js,则最终将两者都匹配。

这是我发现将它们包含在顶级gulp.src函数中的唯一方法。创建一个可以分离出每个glob的插件/函数可能很简单,但是您可以为它们指定基本目录。


我认为必须从多个基本路径开始可能超出了问题的范围。从最初的问题开始,我将文件移到绝对路径,但是仍然出现问题,即没有指定基数,我所有glob的所有文件都被复制到一个目录中,而没有遵循它们的现有层次结构。
M1ke 2015年

2
@ M1ke是的,您的问题的重点不是针对不同的基本路径。但是,您提到了However it flattens the dir structure - all directories are copied but every file is placed in the root /var/www,这实际上是我找到您的问题的方式-我正在寻找一种解决方案,该解决方案是如何使用不同的基本路径进行递归复制。本质上,此解决方案适用于您的情况,而无需指定默认基数,但也适用于多基路径的情况,只要您可以确保前导星不匹配任何内容即可:)
ty1824

6
这个答案很特殊。它专门处理从任意起点复制路径,例如。src可能是'assets/subdir/*fonts/*'复制字体dir。
Wtower

-4

如果要将一个文件夹的全部内容递归复制到另一个文件夹,可以从gulp执行以下Windows命令:

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y

最后的/y选项是禁止覆盖确认消息。

在Linux中,您可以从gulp执行以下命令:

cp -R /path/to/srcfolder /path/to/destfolder

您可以使用gulp-execgulp-run插件从gulp执行系统命令。

相关链接:

  1. xcopy使用

  2. gulp-execgulp-run


7
回到这里的问题是您将失去在流上运行其他命令的能力,例如压缩或分析工具。
M1ke 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.