使 dest 文件夹适应 ** 通配模式

Adapt dest folder to ** globbing pattern

我正在使用 grunt-contrib-copy。我有这个文件树:

`-- src
    `-- model
        |-- a4
        |   `-- public
        |       |-- css
        |       |-- img
        |       `-- js
        |-- posters
        |   `-- public
        |       |-- css
        |       |-- img
        |       `-- js
        `-- prints
            `-- public
                |-- css
                |-- img
                `-- js

我想将文件复制到 src/model/**/public/imgdist/images/{1}/ 其中 {1} 是文件夹名称(a4、海报、印刷品...动态文件夹也必然会更改),因此:

src/model/a4/public/img/file.png -> dist/images/a4/file.png

有没有办法用 grunt-contrib-copy 指定它(也许是重命名功能?)还是我必须手动迭代文件?

现在这是我拥有的:

grunt.registerTask 'images-generate', ->
gruntCopyFiles.images = {
  expand: true,
  cwd: './src/model/',
  src: ["**/public/img/*.png", "**/public/img/*.jpg"],
  dest: "./dist/images/"
}

但这会将 src/model/a4/public/img/file.png 复制到 dist/images/a4/public/img/file.png,这不是我想要的。

有什么建议吗?谢谢!

看起来您可以使用 flatten 来获得精简的目标路径:

gruntCopyFiles.images = {
  flatten: true,
  expand: true,
  cwd: './src/model/',
  src: ["**/public/img/*.png", "**/public/img/*.jpg"],
  dest: "./dist/images/"
}

来自the docs

  • flatten Remove all path parts from generated dest paths.

Is there a way to specify that with grunt-contrib-copy (maybe the rename function?) or do I have to iterate manually over the files?

利用rename函数是实现这一点的方法。单独的 glob 模式不能满足您的要求,flatten 选项也不能。

像下面这样的东西也会复制任何子文件夹,可能可能驻留在源 img 文件夹中:

gruntCopyFiles.images = {
    expand: true,
    cwd: 'src/model',
    dest: 'dist/images',
    src: '**/public/img/**/*.{png,jpg,gif}',
    rename: function(dest, src) {
        var items = src.split('/'),
            baseIndex = items.indexOf('img') + 1,
            subPath = items.slice(baseIndex, items.length).join('/');

        return [dest, items[0], subPath].join('/');
    }
}

示例:

src/model/a4/public/img/file.png --> dist/images/a4/file.png

src/model/a4/public/img/quux/file.jpg --> dist/images/a4/quux/file.jpg