如何根据grunt中运行的任务进行日志记录?

时间:2015-01-09 12:20:48

标签: logging gruntjs task target

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

这样的东西
if(grunt.runningTasks.substr('task:subtask') > -1)

原始问题 -

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

我从我的gruntfile中提取配置(我使用load-grunt-config)我想根据我正在运行的任务进行记录以及是否输入了 - 浏览器

示例运行将是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 %>'
            }
        }
    }
}

};

1 个答案:

答案 0 :(得分:1)

好的,按照上述评论的路径,我现在看到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收集到这些内容。)