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

时间:2015-06-26 07:32:57

标签: javascript file gruntjs concat

抱歉,如果这个帖子的名字有点奇怪。很难用一行来解释。

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

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

从我的根文件夹(html5)我有一个src和一个build文件夹。在这两个文件夹中,将有比主文件夹更多的文件夹,所有文件夹都具有相同的布局(不同的格式)。我基本上想要发生的是,我想要src中的内容>将主文件夹展平为相应的构建>主文件夹。我已经尝试了展示here的展平选项,但会使整个事情变得扁平,导致主文件夹的内容直接放在构建文件夹中,这不是我想要的。我一直在使用重命名功能搞乱一些,但这项任务似乎过于复杂。没有其他办法可以做到这一点吗?

编辑:我有这个任务:

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

这正是它应该做的事情。 然而,我真的需要目标文件夹“master”是动态的。它不应该像现在这样硬编码。它必须是从src文件夹复制的相应文件夹。不幸的是,将“**”放在那里是行不通的。

1 个答案:

答案 0 :(得分:0)

You need to combine cwd with flatten (and dest) to flatten just what you want, just where you want. As you don't know the name of your folders, you have to use a custom task to get the list of folders, and then generate and run a copy target for each:

  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);
    });
  });