我在一个项目上执行一些繁重的任务。其中之一设置了许多grunt.options grunt.option(key, value),我需要在后续任务var option = grunt.option(key)中访问这些grunt.option(key, value)。当我试图在后一个任务中访问这些选项时,这些选项将返回undefined。
如果我将变量记录在后一个任务的顶部,则会在该任务运行之前显示该变量,并且无法访问任务配置中先前设置的值。
在设置grunt.option和在另一个任务中使用它通知更改时需要做些什么吗?我是不是做错了什么事?或者是否有更好的方法来使用全局变量(我的研究表明我使用grunt.option)
My 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设置后,使我知道他们是正确的设置。
set-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。如果我在grunt.options开始时将测试值设置为这些Gruntfile.js,那么我可以毫无问题地访问它们:
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');
}(我检查了双、三、四倍是否使用了正确的选项键)
发布于 2015-06-19 12:15:24
问题是,在设置set-env任务中的选项之前,您正在访问任务的“配置阶段”期间设置的grunt选项集中的变量,该选项运行一次。在代码中的那个点计算自定义选项键确实应该产生undefined。(请注意,这实际上相当于使用initConfig块)
相反,您要做的不是从options对象中读取选项值,而是使用grunt.config.set直接修改任务的config对象,这将使您能够执行您一直在尝试的操作。
所以基本上,而不是
grunt.option(propName, propValue);使用类似的东西
grunt.config.set('mytask.replacements', options.replacements);(当然,这需要对您的代码进行大规模的重新处理,我不了解这一点。)
编辑:可能有一个更干净的解决方案,使用grunt的模板功能,请参阅这个堆叠溢出的答案和grunt 关于模板的api文档
可以使用提供的模板函数手动处理模板字符串。此外,config.get方法(由许多任务使用)自动扩展Gruntfile中指定为配置数据的<% %>样式模板字符串。
重点是,这些值不是在分析配置块时计算的,而是在任务使用config.get读取值时计算的。
使用options对象在任务之间共享值的模式在您的两个自定义任务之间工作得更好--您可以在一个任务中设置它,在另一个任务中读取它,而不是在配置中,而是作为运行任务的一个实际步骤。
一般来说,虽然这看起来是可行的,但我要说的是,这并不是工作流咕噜的想法--如果您知道您正在运行的是哪个环境,那么当您运行一个grunt任务时,更容易通过options命令行标记直接传递环境参数,这在您正在执行的任何任务配置中都会生效。
https://stackoverflow.com/questions/30936658
复制相似问题