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

Deployment 如何使用gulp递归复制目录?,deployment,gulp,Deployment,Gulp,我正在尝试将项目从工作目录转移到服务器(同一台机器)。使用以下代码: gulp.src([ 'index.php', 'css/**', 'js/**', 'src/**', ]) .pipe(gulp.dest('/var/www/')); 我希望看到所有的文件都被复制。但是,它使目录结构扁平化-所有目录都被复制,但每个文件都放在根目录中/var/www Gulp似乎是一个很好的构建工具,但复制项应该是一个简单的过程,当然?结果表明,要复制完整的目录结构,Gu

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

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));
我希望看到所有的文件都被复制。但是,它使目录结构扁平化-所有目录都被复制,但每个文件都放在根目录中
/var/www


Gulp似乎是一个很好的构建工具,但复制项应该是一个简单的过程,当然?

结果表明,要复制完整的目录结构,Gulp需要为您的
Gulp.src()
方法提供一个基础

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

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

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

以下操作可以在不展平文件夹结构的情况下工作:

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

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

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

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y
cp -R /path/to/srcfolder /path/to/destfolder
末尾的
/y
选项用于抑制覆盖确认消息

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

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y
cp -R /path/to/srcfolder /path/to/destfolder
您可以使用gulpexecgulprun插件从gulp执行系统命令

相关链接:


  • 因此,如果所有路径都具有相同的基本路径,那么提供基本路径的解决方案是有效的。但是如果您想提供不同的基本路径,这仍然不起作用

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

    gulp.src([
        'index.php',
        '*css/**/*',
        '*js/**/*',
        '*src/**/*',
    ])
    .pipe(gulp.dest('/var/www/'));
    
    这样做的原因是Gulp将base设置为第一个显式块的结尾-前导*导致它将base设置为cwd(这是我们都想要的结果!)

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


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

    我想你忘了加一大口。应该是
    .pipe(gulp.dest('output/folder')如何使用特定的文件扩展名执行此操作?是否可以编辑答案以提供原始文件集的示例?我不确定这是否更合适,但我很乐意看看它与
    {base:“.”
    方法相比是如何工作的。需要注意的是,
    base
    的默认值是这个答案中给出的“folder”。换句话说,基础从全局模式开始的地方开始。这有助于我了解文件的最终位置,这也是为什么在
    gulp.dest
    参数中不需要
    ***
    的原因。Gulp将glob中的所有内容以相同的结构放入dest文件夹。这并不能完全回答所问的问题。对于如何正确地递归复制,这是一个很好的解决方案,但它不回答如何修改基本目录。对于阅读此问题的任何新观众,应该注意的是,投票率最高的答案无法解决不展平目录的原始问题规范。它确实解决了人们在复制目录中的所有文件时遇到的问题,所以这很有用!通过不扁平化,您的意思是希望“css”、“js”和“src”目录出现在
    /var/www/
    中吗?你可以试试
    {css,js,src}/***
    我知道glob扩展在gulp中可以工作,但是我会感到困惑的是,如果这对列表中的每一项都有不同的作用,因为glob扩展基本上只是为了在执行之前扩展到一个列表。返回shell的问题是,您将失去在流上运行其他命令的能力,例如压缩或分析工具。我认为从多个基本路径开始可能超出了问题的范围。从我最初的问题中,我将文件移动到一个绝对路径,但问题仍然存在,即在没有指定基的情况下,所有全局文件中的所有文件都复制到一个目录中,而不遵循它们现有的层次结构。@M1ke是真的,您问题的要点不是针对不同的基路径。但是,您提到了
    ,但是它使目录结构变平了-所有目录都被复制,但每个文件都放在根/var/www
    中,这实际上就是我发现您的问题的原因-我正在寻找一种解决方案,即如何使用不同的基本路径递归复制。基本上,此解决方案适用于您的情况,无需指定默认基数,但也适用于多基路径情况,只要您可以确保前导星不匹配:)此答案是例外的。它专门处理从任意起点复制路径的问题,例如,src可以是
    'assets/subdir/*fonts/*'
    来复制字体目录。添加“cwd”配置以设置当前工作目录。如果
    base
    仍然让您感到困惑,请看哪一个可以很好地解释它。