0

我阅读了 Grunt 官方文档和这篇文章各自的文件名

不幸的是,我没有得到答案

我有以下文件结构:

src/
    modules/
        module1/
            static/
                abc.js
                def.js
                ......
        module2/
            static/
                123.js
                456.js
                ......

这是我的 Gruntfile 片段:

        module1: {
            options: {
                idleading: 'module1/static/'
            },
            files: [
                {
                    cwd: 'modules/module1/static',
                    src: '**/*.js',
                    dest: '.build/module1/static'
                }
            ]
        },
        module2: {
            options: {
                idleading: 'module2/static/'
            },
            files: [
                {
                    cwd: 'modules/module2/static',
                    src: '**/*.js',
                    dest: '.build/module2/static'
                }
            ]
        },

如您所见,这两个目标非常相似,唯一的区别是“模块”名称,我们得到了大约 20 多个模块……所以将上述配置复制 20 多次似乎太愚蠢了……

所以我的问题是:我能找到一种方法来编写一个函数,遍历所有目录,提取模块名称,然后传递给“cwd”、“dest”、“idleading”等配置吗?

请给我解决方案目录,非常感谢!

4

2 回答 2

1

很抱歉回答我自己的问题。但我写了一个 Gruntfile 来解决这个问题。我不能在评论中发布它...

grunt.registerTask('recursive_transport', 'recursive every directory, and perform transport task', function () {

    var dirList = [];
    var root = "applications";

    (function walk(path) {
        var items = fs.readdirSync(path);
        items.forEach(function (item) {
            if (fs.statSync(path + '/' + item).isDirectory()) {
                dirList.push(path + '/' + item);
                walk(path + '/' + item);
            }
        });
    })(root);// search all directories

    // exclude special directory
    function isExcludeDir(dirName) {
        if (dirName.indexOf('test') > -1) {
            return true;
        }
        if (dirName.indexOf('service') > -1) {
            return true;
        }
        if (dirName.indexOf('css') > -1) {
            return true;
        }
        if (dirName.indexOf('html') > -1) {
            return true;
        }
        if (dirName.indexOf('3rd-lib') > -1) {
            return true;
        }
        return false;
    }

    dirList.forEach(function (item, index) {

        item = item.substr((root + '/').length);// cut the leading path "applications/", then leaving "employee/static"

        if (!isExcludeDir(item)) {

            var targetName = "transport.build" + index;// such as 'transport.build0'

            grunt.config.set(targetName + '.options.idleading', item + '/');
            grunt.config.set(targetName + '.files', [
                {
                    cwd: root + '/' + item,
                    src: '*.js',
                    dest: '.build/' + item
                }
            ]);

            grunt.task.run(targetName.replace('.', ':'));
        }

    });

});
于 2013-10-28T06:28:57.093 回答
0

是的,有;您正在寻找的是 grunt-multi。我已经对此进行了一些尝试,并为复制任务提供了类似的配置,因此希望这对您有所帮助:

grunt.initConfig({
    transport: {
        modules: {
            options: {
                idleading: '<%= module %>/static/'
            },
            files: [
                {
                    cwd: 'modules/<%= module %>/static',
                    src: '**/*.js',
                    dest: '.build/<%= module %>/static'
                }
            ]
        }
    },
    multi: {
        modules: {
            options: {
                vars: {
                    modules: {
                        patterns: '*',
                        options: {
                            cwd: 'modules',
                            filter: 'isDirectory'
                        } 
                    }
                },
                config: {
                    module: '<%= modules %>'
                },
                tasks: [ 'transport' ]
            }
        }
    }
});

运行您的任务grunt multi,它将遍历 中的所有目录modules,为每个目录运行传输配置。

完整的文档可在https://github.com/neekey/grunt-multi获得。希望这可以帮助。

于 2013-10-27T17:18:28.837 回答