Grunt条件选项

时间:2013-08-14 02:53:38

标签: pug gruntjs

我正在尝试创建一个Jade任务,它将具有一个构建和开发任务,它具有非常相似的选项,除了dev boolean和一个不同的目标。我能够实现这一目标的最简单方法是:

jade: {
    dev: {
        options: {
            data: {
                dev: true, // dev true
                config: ...,
                pkg: ...,
                helpers: ...
            }
        },
        files: [{
            dest: '<%= config.workingDir %>',
            ...
        }]
    },
    build: {
        options: {
            data: {  // no dev
                config: ...,
                pkg: ...,
                helpers: ...
            }
        },
        files: [{
            dest: '<%= config.buildDir %>',
            ...
        }]
    }
}

虽然有很多重复,特别是如果我想在赛道上添加更多选项。所以我正在尝试创建一个可以从命令行和监视任务工作的构建任务。

我得到的最接近的是这个设置,我可以从命令行运行grunt jade --dev但不能在监视任务中设置dev boolean。

build: {
    options: {
        data: {
            dev: '<%= grunt.option("dev") %>',
            config: ...,
            pkg: ...,
            helpers: ...
        }
    },
    files: [{
        dest: '<%= grunt.option("dev") ? config.workingDir : config.buildDir %>',
        ...
    }]
}

观察任务:

watch: {
    jade: {
        ...
        tasks: ['jade'] // the option is false
    }
}

我还尝试创建一个自定义任务来设置选项,然后运行watch,在收听监视事件时我可以看到该选项已正确设置

grunt.registerTask('dev', 'Grunt dev mode', function(){
    grunt.option('dev', true);
    grunt.task.run('watch');
});

grunt.event.on('watch', function(action, filepath, target) {
    console.log(grunt.option('dev')); // true
});

即使日志显示dev boolean为true,也会传递错误的任务选项。所以,尽管如此,我是否正在以正确的方式设置选项,还是我只是坚持使用重复相同信息的构建和开发任务?

我也尝试过使用grunt.util ._。expand方法,但收效甚微。 data: "<%= grunt.util._.extend(jade.options.data, {dev: true}) %>",

1 个答案:

答案 0 :(得分:2)

您可以在task级别指定options作为默认值,然后在{{1}进一步指定target(dev vs build)特定options水平。这样您就可以避免在多个target

之间重复相同的配置
targets

更新

根据jade: { options : { config: ..., pkg: ..., helpers: ... }, dev: { options: { dev : true }, files: [{ dest: '<%= config.workingDir %>', ... }] }, build: { files: [{ dest: '<%= config.buildDir %>', ... }] } } 案例中的评论,所有选项都必须位于jade中,如果使用上述方法,则本地data将完全覆盖全局{{} {1}},你可以这样做,因为Gruntfile.js只是JavaScript:

data

然后在任务配置中使用这样的方法:

data

请注意,此代码未经过测试。

作为旁注,您可能无法看到var dataConfigBuild = { config: ..., pkg: ..., helpers: ... }; //use your favorite way of "cloning" an object var dataConfigDev = {}; for(var propName in dataConfigBuild) { dataConfigDev[propName] = dataConfigBuild[propName]; } //and add the dev specific stuff dataConfigDev.dev = true; 相关代码中没有看到预期配置的原因,因为您需要设置spawn : false