【问题标题】:How do I log depending on which task is run in grunt?如何根据在 grunt 中运行的任务进行日志记录?
【发布时间】:2015-01-09 12:20:48
【问题描述】:

TL:DR - 是否可以检查某个任务/子任务是否设置为在调用 grunt 时运行?像

if(grunt.runningTasks.substr('task:subtask') > -1)

原始问题 -

我的 karma.js 中有以下代码用于 grunt。我想知道是否可以只执行正在运行的任务的功能

我从我的 gruntfile 中提取配置(我正在使用 load-grunt-config )并且我想根据我正在运行的任务以及是否输入 --browser 进行日志

示例运行将是 grunt karma:jenkins 但这会输出每个目标的日志,因为每个目标都会调用函数,即使 jenkins 目标是唯一运行的目标

如何在实际调用目标之前延迟运行我的函数?

module.exports = function(grunt, config) {
//function to calculate which browser to use as default if one is not specified on the command-line
var returnBrowser = function (taskName ) {
    var defaults = config.defaultBrowsers,
        browser = config.testBrowser;
    if (!browser) {
        browser = defaults[taskName];
        if ( browser ) {
            grunt.log.writeln("No browser option set for unit tests, using " + browser + " which is default for karma:" + taskName + " task.");
            grunt.log.writeln("Use --browser=<chrome || firefox || ie> to set a specific browser");
        } else {
            grunt.log.writeln("No browser option set for unit tests and task karma:" + taskName + " does not have a default browser specified. Defaulting to IE");
            grunt.log.writeln("Use --browser=<chrome || firefox || ie> to set a specific browser");
            browser = defaults['default'];
        }
    }
    return [browser];
}
return {
    options: {
        configFile: 'karmastandalone.conf.js',
        singleRun: true,
        autoWatch: false,
        reporters: ['progress']
    },
    test: { 
        browsers: returnBrowser('test')
    },
    jenkins: {
        browsers: returnBrowser('jenkins'),
        options: {
            reporters: ['progress', 'junit'],
            junitReporter: {
                outputFile: '<%= junitOutputFile %>'
            }
        }
    }
}

};

【问题讨论】:

  • 我有点困惑......那个 JS 模块是你试图运行的自定义 grunt 任务吗?
  • 很抱歉造成混乱,这是 grunt-karma 任务。我正在使用 load-grunt-config ,它允许您将配置分解为单独的文件,因此该文件将是 karma.js 并将其 conf 导出为对象或函数。您可以查看该项目以了解有关此方法的更多详细信息
  • 啊啊……明白了。好的,所以,我认为你可以做你所要求的,但据我所知,不仅仅是配置。我不在我的主计算机旁,但我会在我坐在办公桌前时尝试展示一个使用自定义任务的示例。
  • 嗯...不确定完整的解决方案,但是对于您的第一个问题,您可以使用grunt API 来确定任务是否存在:grunt.task.exists('task:subtask')(虽然我没有使用它用于子任务)。您可以使用以下命令获取命令行选项:grunt.option('browser')
  • 谢谢,我知道任务存在,但是我希望能够判断当前别名是否会调用任务(即,如果默认包含业力或任务又包含业力当 grunt 运行时)

标签: logging gruntjs task target


【解决方案1】:

好的,所以按照上面 cmets 的路径,我现在更清楚地看到了 OP 的要求。不幸的是,据我所知,没有公开公开的 API。但是,您可以从传递到各个模块的 grunt 对象访问此信息。

在下面的示例中,我有一个简单的build 任务,如您所见,它是另外两个任务的别名,其中一个指定了目标(子任务)。如果我需要知道给定任务是否指定了特定的子任务,我可以这样做:

grunt.registerTask('build', ['concat:js', 'uglify']);

grunt.registerTask('isjsbuild', function() {
    var info = grunt.task._tasks['build'].info;
    // 'info' in this case would be: "Alias for \"concat:js\", \"uglify\" tasks."

    if (/^Alias.+?concat\:js/.test(info)) {
        grunt.log.writeln('we have concat:js in an alias!');

        // do whatever you need to here...
    }
});

这里有一些明显的警告:首先是这是一个未记录的内部对象!这意味着它可能随时更改,因此谨慎使用 .

另外,我正在运行它作为它自己的任务。如果你在那个动态配置模块中运行它,我不确定它会如何执行。此外,这不使用任何输入,但如果需要,您可以使用 grunt.option('whatever') 获取 CLI 选项。最后,这并不假定给定任务 (build) 实际上在队列中,它只是根据当前配置获取信息,因此您可能需要检查给定任务是否在队列中,例如:grunt.task.exists('build');

希望这会有所帮助!
(如果你好奇,我从Grunt source code 收集到这个。)

【讨论】:

  • 谢谢一百万,足以让我从这里糊里糊涂。附言喜欢霍布斯头像:)
  • 耶!很高兴我们终于找到了你需要的东西。我 Calvin长大的,甚至还有一只毛绒老虎。 :)
猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
相关资源
最近更新 更多