【问题标题】:How do I copy directories recursively with gulp?如何使用 gulp 递归地复制目录?
【发布时间】:2014-09-22 03:57:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • 对于阅读此问题的任何新观众,应该注意的是,最高投票的答案不能解决不展平目录的原始问题规范。它确实解决了人们遇到的问题,不是所有文件目录中都被复制,所以这很有用!
  • 不展平,你的意思是你想让'css'、'js'和'src'目录出现在/var/www/中吗?你可以试试{css,js,src}/**/*
  • 我知道 glob 扩展确实在 gulp 中起作用,但如果它作为列表中的单独行对每个项目的工作方式不同,我会感到困惑 - 因为 glob 扩展基本上只是为了扩展为执行前列出。

标签: deployment gulp


【解决方案1】:

以下工作不会展平文件夹结构:

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

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

【讨论】:

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

所以 - 鉴于所有路径都具有相同的基本路径,提供基本路径的解决方案有效。但是如果你想提供不同的基本路径,这仍然行不通。

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

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

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

这仅在您可以确保您的文件夹结构不会包含可以匹配两次的某些路径时才有效。例如,如果您的 randomjs/js 处于同一级别,那么您最终会匹配两者。

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

【讨论】:

  • 我认为必须从多个基本路径开始可能超出了问题的范围。从我最初的问题中,我将文件移动到绝对路径,但问题仍然存在,即在没有指定基础的情况下,我所有 glob 中的所有文件都被复制到一个目录中,而没有遵循它们现有的层次结构。
  • @M1ke 的确,您的问题的重点不是针对不同的基本路径。但是,您提到了However it flattens the dir structure - all directories are copied but every file is placed in the root /var/www,这实际上就是我发现您的问题的方式 - 我正在寻找如何使用不同的基本路径递归复制的解决方案。本质上,此解决方案适用于您的情况,而无需指定默认基数,但也适用于多基路径情况,只要您可以确保前导星不匹配任何内容:)
  • 这个答案很特别。它专门处理从任意起点复制路径,例如。 src 可以是'assets/subdir/*fonts/*' 来复制字体目录。
  • 我做了一些挖掘,发现为了消除不匹配的机会,你可以使用@(css)/**/*,例如。这将保留文件夹结构,但@() 意味着它只会专门匹配该文件夹(您也可以提供多个文件夹)。有关更多信息,请参阅 glob 的文档。 npmjs.com/package/glob
【解决方案3】:

如果你想将一个文件夹的全部内容递归地复制到另一个文件夹中,你可以从 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 usage

  2. gulp-execgulp-run

【讨论】:

  • 这里退回到 shell 的问题是您将失去在流上运行其他命令的能力,例如压缩或分析工具。
【解决方案4】:

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

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

如果你像我一样忘记了这一点,那么试试吧:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2019-09-18
  • 2016-12-20
  • 2015-05-18
  • 2013-11-06
相关资源
最近更新 更多