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

时间:2014-07-30 13:25:01

标签: deployment gulp

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

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

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

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

4 个答案:

答案 0 :(得分:290)

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

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

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

答案 1 :(得分:163)

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

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

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

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

答案 2 :(得分:54)

所以 - 假设所有路径具有相同的基本路径,提供基础的解决方案。但是如果你想提供不同的基本路径,这仍然无法发挥作用。

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

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

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

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

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

答案 3 :(得分:-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-exec gulp-run 插件从gulp执行系统命令。

相关链接:

  1. xcopy usage

  2. gulp-execgulp-run