2015-06-19 69 views
2

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

如果我在后面的任务的头部记录变量,则在该任务运行之前显示该变量,并且我无法访问任务配置中以前设置的值。

在设置grunt.option和在另一个任务中使用它以通知变化的咕噜声之间,我需要做些什么?我在这里做了一些固有的错误吗?还是有更好的方式与各种各样的全局变量来做到这一点(我的研究指出我使用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 
     .... 
     .... 
     .... 
     .... 
    ] 
); 

在我的设置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)); 
       ...... 
       ...... 
      } 
     } 
     ...... 
     ...... 
    }); 

}; 

当我尝试从我访问上述任务设置的grunt.options字符串替换(或任何其他后续)任务undefined返回。如果我在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

问题在于,在设置set-env任务中的选项之前,您正在运行一次任务的“配置阶段”期间访问来自grunt选项集的变量。在代码中当时评估自定义选项键的确应该产生undefined。 (请注意,这实际上相当于使用initConfig块)

您所做的不是从选项对象中读取选项值,而是使用grunt.config.set直接修改任务的配置对象,这将启用你做你一直在尝试的东西。

所以基本上,而不是

grunt.option(propName, propValue); 

使用类似

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

(当然,这需要你的代码的一个相当大的改造,我不明白成。)


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

模板字符串可以使用手动提供的模板功能进行处理。另外,config.get方法(由许多任务使用)自动扩展在Gruntfile中指定为配置数据的样式模板字符串。

问题的关键在于,只有当任务使用config.get读取值时,才会对配置块进行分析时评估这些值。


您使用的选项的模式对象在任务间共享价值观的作品更好,如果它是你的两个自定义任务之间 - 你可以将其设置为一个任务,在其他阅读它,而不是在配置,但作为运行任务的实际步骤。一般来说,尽管它看起来可行,但我认为这不是grunt所想到的工作流程 - 如果您知道您正在运行哪个环境,可以通过options命令传递环境参数更容易直线标志,当你运行一个咕噜任务时,这将在你正在做的任何配置中生效。

+0

模板做到了。非常感谢! – Fraser