Grunt为任务设置选项并使用新值运行该任务

时间:2015-02-06 11:09:14

标签: javascript html gruntjs build-process

我在项目中添加了Grunt构建自动化。

我创建了一个自定义任务,为其他任务设置变量,现在我想使用我设置的值运行任务。

grunt.registerTask('dist-flow', function () {
    if (!grunt.option('env')) {
        grunt.option('env', 'prod');
        console.log(grunt.option('env'));
    }
    grunt.registerTask('dist',['dev_prod_switch']);
    grunt.task.run('distdev');
});

但每当我运行dist-flow任务时,它会将env设置为prod,但dev_prod_switch始终采用我为dev_prod_switch设置的默认值。

所以我想从任务中设置选项并使用新值运行特定任务。

1 个答案:

答案 0 :(得分:3)

问题:

根据您的问题和评论,我假设您的Gruntfile.js看起来像这样。

Gruntfile.js:

module.exports = function(grunt) {

    grunt.initConfig({
        dev_prod_switch: {
            options: {
                environment: grunt.option('env') || 'dev',
                env_char: '#',
                env_block_dev: 'env:dev',
                env_block_prod: 'env:prod'
            },
            all: {
                files: {
                    'appCommon/config.js': 'appCommon/config.js',
                }
            }
        },
    });

    grunt.registerTask('dist-flow', function () {
        if (!grunt.option('env') ) {
            grunt.option('env', 'prod');
            console.log(grunt.option('env'));
        }
        grunt.registerTask('dist',['dev_prod_switch']);
        grunt.task.run('distdev');
    });
};

您的问题是您尝试在任务中设置option,并在initConfig对象中将其读回。问题是,initConfig在您的任务之前运行,因此在运行environment任务时dist-flow已设置为默认值。

这一行:

environment: grunt.option('env') || 'dev',

在此行之前运行:

grunt.option('env', 'prod');

解决方案:

在您的任务中,您可以通过grunt.config访问您的配置选项,因此您可以像这样修改配置对象中的值。

grunt.config.data.dev_prod_switch.options.environment = grunt.option('env');

示例Gruntfile.js:

module.exports = function(grunt) {

    grunt.initConfig({
        dev_prod_switch: {
            options: {
                environment: grunt.option('env') || 'dev',
                env_char: '#',
                env_block_dev: 'env:dev',
                env_block_prod: 'env:prod'
            },
            all: {
                files: {
                    'appCommon/config.js': 'appCommon/config.js',
                }
            }
        },
    });

    grunt.registerTask('dist-flow', function () {
        if (!grunt.option('env') ) {
            grunt.option('env', 'prod');
            console.log(grunt.option('env'));
            grunt.config.data.dev_prod_switch.options.environment = grunt.option('env');
            console.log(grunt.config.data.dev_prod_switch.options.environment);
        }
        grunt.registerTask('dist',['dev_prod_switch']);
        grunt.task.run('distdev');
    });
};