是否可以在Grunt任务中提取文件名(使用grunt-cmd-transport插件)

时间:2013-10-26 05:05:11

标签: gruntjs

我阅读了Grunt官方文档和这篇文章respective file name

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

我有以下文件结构:

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”这样的配置?

请向我展示解决方案目录,非常感谢!

2 个答案:

答案 0 :(得分: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('.', ':'));
        }

    });

});

答案 1 :(得分:0)

是的,有;你在寻找什么是咕噜咕噜的。我已经玩了一下这个并且有一个类似的配置工作的复制任务,所以希望这对你有用:

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获得。希望这会有所帮助。