反映源文件夹grunt的目标文件

Destination file that reflects source folders grunt

本文关键字:目标 文件 grunt 文件夹 源文件      更新时间:2023-09-26

如果这个线程的名称有点奇怪,很抱歉。很难用一句话来解释。

基本上,这就是我想要的文件夹设置的样子:

                html5
                  |
   src-----------------------build------_config
    |                           |           |
  master                      master    Gruntfiles etc
    |                           |
css-images-js-index.html        |
 |    |    |                    |
.css .jpg .js                   |
                                |
                           .css .jpg .js

在我的根文件夹(html5)中,我有一个src和一个构建文件夹。在这两个文件夹中,将有比主文件夹多得多的文件夹,所有文件夹都将具有相同的布局(不同的格式)。我基本上想做的是,我希望src>master文件夹中的内容被展平到相应的build>master文件夹。然而,我已经尝试了这里显示的压平选项,它会压平整个内容,导致主文件夹的内容直接放在构建文件夹中,这不是我想要的。我一直在摆弄重命名函数,但对于这项任务来说,它似乎过于复杂了。没有其他方法可以做到这一点吗?

编辑:我有这个任务:

    copy: {
        images: {
            files: [
                {
                    expand: true,
                    flatten: true,
                    cwd: "../src/",
                    src: ["**"],
                    dest: "../build/master",
                    filter: "isFile"
                },
            ]
        }
    },

这正是它应该做的。但是,我真的需要目标文件夹"master"是动态的。它不应该像现在这样被硬编码。它需要是从src文件夹中复制的相应文件夹。不幸的是,把"**"放在那里是行不通的。

您需要将cwdflatten(以及dest)组合起来,以使您想要的东西、想要的地方变平。由于您不知道文件夹的名称,因此必须使用自定义任务来获取文件夹列表,然后为每个文件夹生成并运行copy目标:

  grunt.registerTask('myCopy', function() {
    var srcFolder = 'src';
    var dstFolder = 'dest';
    var fs = require('fs');
    var path = require('path');
    var srcpath = path.resolve(__dirname, srcFolder);
    var folders = fs.readdirSync(srcpath).filter(function(file) {
      return fs.statSync(path.join(srcpath, file)).isDirectory();
    });
    folders.forEach(function(f){
      grunt.config.set("copy." + f, {
        files : [{
            expand: true,
            flatten: true,
            cwd: srcFolder + '/' + f,
            src: '**',
            dest: dstFolder + '/' + f,
            filter: 'isFile',
        }]
      });
      grunt.task.run('copy:' + f);
    });
  });