【问题标题】:Programmatically controlling Grunt.js以编程方式控制 Grunt.js
【发布时间】:2013-11-27 16:53:48
【问题描述】:

我想访问 grunt 生态系统中的许多可用插件和任务,以使我的生活更轻松,但我想控制每个任务的运行时间和方式。最重要的是,我想要一种以编程方式运行 grunt 任务的方法,而不是从带有Gruntfile 的文件夹中的命令行运行grunt。所以我开始在grunt-cligrunt 周围寻找“进入”的途径。

来自GruntJS的源码:

// Expose the task interface. I've never called this manually, and have no idea
// how it will work. But it might.
grunt.tasks = function(tasks, options, done) {
    ...

如您所见,Allman 先生提醒我们注意界面...我的问题是,有没有人让它工作?

到目前为止,我的实验使我相信以编程方式控制 grunt 的最佳方法是通过子进程模仿命令行调用:

$ npm install grunt-cli //notice no -g flag

// From runner.js
var exec =require('child_process').exec

exec('node_modules/.bin/grunt-cli tasks to run', {
  cwd: 'path/to/directory/with/a/gruntfile'
}, function() { /* do stuff here */ });

这看起来很脏,所以我正在考虑简单地编写我自己的任务运行器,它为 grunt 任务公开一个接口。但是,如果有人在 grunt.tasks() 上取得成功,尽管有 Allman 先生的警告,我不想重复工作。

【问题讨论】:

  • 如果你举个例子说明你正在尝试做什么,这可能会更容易回答。
  • 谢谢...我会添加一些伪代码

标签: javascript node.js gruntjs


【解决方案1】:

显而易见的答案似乎应该是编写一个繁重的任务来做任何你想做的事情:)

然后你可以使用grunt.task.run()来控制其他grunt任务:http://www.gruntjs.org/article/grunt_task.html

您还可以在运行它们之前动态更新它们的配置,很容易通过弄乱grunt.config

还有这个答案可以回答你的问题: How can I run a grunt task from within a grunt task?

还可以查看未公开记录的grunt.task.start(),但它似乎启动了所有任务https://github.com/gruntjs/grunt/blob/master/lib/util/task.js#L246(帽子提示:@jibsales)

【讨论】:

  • 虽然这有利于从 grunt 任务中运行 grunt 任务,但我试图避免从命令行运行 grunt 来启动所有内容。我正在更新我的问题,以便更清楚。
  • 您具体要避免什么?它是在全球安装 grunt 吗? grunt 只是一个节点程序....
  • 嗯...重新考虑您答案中的链接可能现在触发了正确的突触。坚持住,需要测试。
  • 你甚至可以只做var grunt = require('grunt'); grunt.task.run()....
  • 如果您需要致电grunt.task.start(),我会将您的答案标记为正确
【解决方案2】:

也许这会帮助您编写自定义处理程序:https://www.npmjs.com/package/rungrunttask

使用详情

var RunGruntTask = require('rungrunttask').RunGruntTask;
var taskname = 'some grunt task such as backup database every 24hours';
RunGruntTask(taskname);

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 2011-07-09
    • 2011-07-06
    • 2011-04-06
    • 2015-11-20
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多