繁体   English   中英

由上一个任务设置的 Grunt 任务 grunt.option 返回未定义

[英]Grunt task grunt.option set by previous task returns undefined

我正在一个项目上运行一些 grunt 任务。 其中之一设置了一些 grunt.options grunt.option(key, value)我需要在后续任务中访问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,所以我知道它们被正确设置。

设置环境任务

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');
}

(我已经双重、三重和四重检查我使用的是正确的选项键)

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

你要做的不是从选项对象中读取选项值,而是直接修改任务的配置对象,使用grunt.config.set ,这将使你能够做你一直在尝试的事情。

所以基本上,而不是

grunt.option(propName, propValue);

使用类似的东西

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

(当然,这将需要对您的代码进行大量修改,我不会涉及。)


编辑:可能有一个使用 grunt 模板功能的更简洁的解决方案,请参阅此 stackoverflow 答案,以及关于模板的 grunt api 文档

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

关键是这些不是在解析配置块时评估,而是仅在任务使用config.get读取值时评估。


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

一般来说,虽然看起来可行,但我想说这不是 grunt 考虑的工作流程 - 如果您知道运行 grunt 的环境,则直接通过 options 命令行标志传递环境参数会更容易当您运行 grunt 任务时,它已经在您正在执行的任何任务配置中生效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM