上一个任务设置的Grunt任务grunt.option返回undefined

时间:2015-06-19 11:08:57

标签: javascript gruntjs

我在项目上运行了许多grunt任务。其中一个设置了一些我需要在后续任务grunt.option(key, value)中访问的grunt.options var option = grunt.option(key)。当我尝试在后一个任务中访问它们时,这些选项返回undefined

如果我将变量记录在后一个任务的开头,则会在该任务运行之前显示该变量,并且我无法访问任务配置中先前设置的值。

在设置grunt.option和在另一个任务中使用它来通知grunt变更之间我需要做些什么吗?我在这里做了一些固有的错误吗?或者有一个更好的方法来做这个全局变量(我的研究指出我使用grunt.option)

我的Gruntfile.js

grunt.log.writeln('loading tasks');
grunt.loadTasks('grunttasks');
grunt.log.writeln('tasks loaded');

grunt.registerTask(
    'jenkins',[
        'clean', //clears out any existing build folders
        'curl', //gets build config file from remote server
        'set-env', //sets the grunt.options based on the build config file
        'string-replace:config', //attempts to access the new grunt.options
        ....
        ....
        ....
        ....
    ]
);

在我的set-env任务中,我根据curl任务中返回的文本文件的内容设置了一些环境变量。这工作正常,我可以在设置后立即记录所有grunt.options,所以我知道它们设置正确。

设置-ENV-任务

module.exports = function(grunt) {

    grunt.registerTask('set-env', 'set-env', function() {
        ......
        ......
        for (var i = 0; i < propFile.length; i++) {
            if (propFile[i] !== '') {
                ......
                ......
                keyValues[propName] = propValue;
                grunt.option(propName, propValue);
                console.log("FROM GRUNT.OPTION " + grunt.option(propName));
                ......
                ......
            }
        }
        ......
        ......
    });

};

当我尝试从我的字符串替换(或任何其他后续)任务undefined中访问上述任务中设置的grunt.options时,返回。如果我在我的Gruntfile.js开头为这些grunt.options设置测试值,我可以毫无问题地访问它们:

module.exports = function(grunt) {
    grunt.config('string-replace', {
        ..........
        ..........
        config:{
            files: configFiles,
            options: {
                replacements: [
                    ..........
                    ..........
                    {
                        pattern: /var _OPTION_KEY = \"(.*?)\"\;/ig,
                        replacement: 'var _OPTION_KEY = "'+grunt.option('_OPTION_KEY')+'";' //grunt.option('_OPTION_KEY') here is undefined
                    }
                    ..........
                    ..........
                ]
            }
        }
        ..........
        ..........
    });
    grunt.loadNpmTasks('grunt-string-replace');
}

(我有双倍,三倍和四倍检查我使用了正确的选项键)

1 个答案:

答案 0 :(得分:1)

问题是您在&#34; config阶段&#34;期间从grunt选项集中访问变量。在set-env任务中设置选项之前,运行一次的任务。在代码中的那一点评估自定义选项键确实应该产生undefined。 (注意,这实际上相当于使用initConfig块)

您所做的不是从选项对象中读取选项值,而是使用grunt.config.set直接修改任务的配置对象,这将使您能够执行您尝试过的操作

基本上,而不是

grunt.option(propName, propValue);

使用类似

的内容
grunt.config.set('mytask.replacements', options.replacements);

(当然,这需要对代码进行大规模的修改,我不会进入。)

编辑:使用grunt的模板功能可能会有更清晰的解决方案,请参阅this stackoverflow answer和咕噜api docs on templating

  

可以使用提供的模板函数手动处理模板字符串。此外,config.get方法(由许多任务使用)自动扩展&lt; %%&gt;样式模板字符串在Gruntfile中指定为配置数据。

关键在于,在解析配置块时不评估这些,但仅当任务使用config.get读取值时才会评估。

使用options对象在任务之间共享值的模式如果在你的两个自定义任务之间更好地工作 - 你可以在一个任务中设置它,在另一个任务中读取它,而不是在配置中,但是作为运行任务的实际步骤。

一般来说,虽然看起来很可行,但我说这不是grunt所考虑的工作流程 - 如果你知道你在哪个环境中咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜运行grunt任务时,通过选项命令行标志直接显示环境参数,该任务已在您正在执行的任何任务配置中生效。