【问题标题】:Copy all files from directory to another with Grunt.js copy使用 Grunt.js 将所有文件从目录复制到另一个目录
【发布时间】:2013-09-28 18:38:01
【问题描述】:

作为构建过程的一部分,我正在尝试将目录中的所有文件复制到另一个目录。它适用于我明确指定的单个文件,但是当我尝试复制整个目录时,它会做一些奇怪的事情,比如复制完整的目录结构(或根本不复制)。这是我的 GruntFile.js 中的相关部分:

copy: {
  myvoice: {
    files: [
      { src:"src/html/index.html", dest:"dist/myvoice/index.html" },
      { src:"src/html/css/style.css", dest:"dist/myvoice/css/style.css" },
      { src:"src/html/js/require.js", dest:"dist/myvoice/js/require.js" },
      { src:"build/myvoice/main.js", dest:"dist/myvoice/js/main.js" },
      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }
    ]
  }
},

具体来说,这是我无法工作的最后一行:

      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }

【问题讨论】:

    标签: javascript gruntjs


    【解决方案1】:

    如果您指定文件 glob,此任务将维护文件夹结构。你想要的是 flatten 选项,它将删除结构。

    {
        expand: true,
        flatten: true,
        src: ['src/html/css/fonts/**'],
        dest: 'dist/myvoice/css/fonts/',
        filter: 'isFile'
    }
    

    Github repo 中查找其余可用选项。希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      this answer 中的 flatten: true 选项可能适用于某些情况,但在我看来,更常见的要求(如我的情况)是按原样复制文件夹及其子文件夹结构,到dest。似乎在大多数情况下,如果您有子文件夹,它们可能会在代码中以这种方式被引用。这样做的关键是cwd 选项,它将保留相对于指定工作目录的文件夹结构:

      copy: {
        files: {
          cwd: 'path/to/files',  // set working folder / root to copy
          src: '**/*',           // copy all files and subfolders
          dest: 'dist/files',    // destination folder
          expand: true           // required when using cwd
        }
      }
      

      【讨论】:

      • 谢谢——你说得对,这个答案更像是我问这个问题时所寻找的。我已经学会了处理上一个答案引起的扁平化,但这很烦人。
      • 我为此损失了一个多小时...如果您使用cwd选项,请务必转expand:true。如果不设置expand:true,cwd将无法正常工作。
      • 我必须确保目录路径以“/”结尾并添加 flatten: false 才能正常工作。
      • **/* 这就是我一直在寻找的东西,我正在使用**谢谢伙计。
      【解决方案3】:

      我想补充一点,在 src 中更改 glob 的格式将修改副本的工作方式。

      正如上面 bmoeskau 所指出的,以下内容将复制 dist/ 内的 everything 并将其移动到 path/to/dir(如果目标已存在,则覆盖它)。

      copy: {
        files: {
          expand: true,
          dest: 'path/to/dir',
          cwd: 'dist/',
          src: '**'
        }
      }
      

      但请注意:

      copy: {
        files: {
          expand: true,
          dest: 'path/to/dir',
          cwd: 'dist/',
          src: '*'
        }
      }
      

      只会复制dist/ 中的文件以及目录,但不会将这些目录的内容复制到目标位置。

      此外,带有src: '*/*' 的以下内容将复制带有dist/ 内容的目录。也就是说,dist/ 内的文件不会被复制。

      copy: {
        files: {
          expand: true,
          dest: 'path/to/dir',
          cwd: 'dist/',
          src: '*/*'
        }
      }
      

      最后,与上面相同,但src: '**/**' 复制dist/ 中的文件以及dist/ 子目录中的文件到path/to/dir。所以目的地内不会有文件夹。

      copy: {
        files: {
          expand: true,
          dest: 'path/to/dir',
          cwd: 'dist/',
          src: '*/*',
          flatten: true,
          filter: 'isFile'
        }
      }
      

      【讨论】:

      • 很好的解释! +1
      • 比github上的文档好,我喜欢例子
      • +1 星数的含义是否有约定,例如** 总是表示文件和目录,* 只是文件?
      • @Imray 来自bash manual:两个相邻的*s 用作单个模式将匹配所有文件以及零个或多个目录和子目录乙>。如果后跟/,则两个相邻的*s 将仅匹配目录和子目录
      • ** 匹配一切,而**/ 目录和子目录(不是文件)。
      【解决方案4】:

      文件段必须使用 egdy 而不是花括号(在 Coffeescript 中)...

      copy: {
        files: [
          cwd: 'path/to/files'
          src: '**/*'
          dest: 'dist/files'
          expand: true
        ]
      }
      

      【讨论】:

        【解决方案5】:

        如果您正在使用 angular yeoman 进行开发,那么这是使用 grunt 进行复制的更好方法。 expand: 使用 cwd 时需要 true。 只是应用程序路由('.')。

         {
            expand: true,
             cwd: '<%= yeoman.app %>/data',
             dest: '<%= yeoman.dist %>/data',
             src: ['**']
            }
        

        【讨论】:

        • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
        猜你喜欢
        • 1970-01-01
        • 2017-11-18
        • 2012-02-15
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 2013-06-01
        相关资源
        最近更新 更多