【问题标题】:How to run a shell command from Grunt task function如何从 Grunt 任务函数运行 shell 命令
【发布时间】:2017-12-07 02:32:57
【问题描述】:

我正在尝试根据我在Gruntfile.js 中的一个函数在我的应用程序目录中移动一些图标。有可能做这样的事情吗?我尝试了以下方法(进入 dev 或 staging 文件夹并将所有文件复制到上一个目录),但无法正常工作。提前致谢。

grunt.registerTask('setAppIcon', 'Task that sets the app icon', function(environment) {
    if (environment.toLowerCase() == "development") {

        grunt.task.run(['exec:command:cd app/lib/extras/res/icon/ios/dev && cp -a . ../']);

    } else if (environment.toLowerCase() == "staging") {

        grunt.task.run(['exec:command:cd app/lib/extras/res/icon/ios/staging && cp -a . ../']);

    } 
});

【问题讨论】:

  • 运行该任务时会得到什么?多年来我没有使用 grunt,但我不记得运行 shell 命令的语法。当我尝试运行该命令时,我得到了“警告:任务”exec:command:cd app/lib/extras/res/icon/ios/dev && cp -a。 ../“ 未找到。”信息。我认为您应该使用专用的 grunt 包来运行 shell 命令。也许github.com/sindresorhus/grunt-shell
  • 感谢 Dawid,我最终使用了 shelljs,但我仍然尝试了您的解决方案,并且效果很好。

标签: javascript node.js gruntjs


【解决方案1】:

是的,可以实现您的要求,但是,当您在函数(即自定义任务)中调用 grunt.task.run 命令时,您需要提供对要运行的任务的引用。

如果你定义一个单独的Target(我们称它们为copy_devcopy_staging - 如下例所示),对于@987654323 中的每个cd ... && cp ... 命令@Task 它应该可以成功运行。


Gruntfile.js

以下Gruntfile.js 要点展示了如何实现这一点:

module.exports = function (grunt) {

  grunt.loadNpmTasks('grunt-exec');

  grunt.initConfig({
    exec: {
      copy_dev: {
        cmd: 'cd app/lib/extras/res/icon/ios/dev && cp -a . ../'
      },
      copy_staging: {
        cmd: 'cd app/lib/extras/res/icon/ios/staging && cp -a . ../'
      }
    }
  });

  grunt.registerTask('setAppIcon', 'Task that sets the app icon', function() {
    var environment = process.env.NODE_ENV;

    // Exit early if NODE_ENV variable has not been set.
    if (!environment) {
      grunt.log.writeln(
        '\"setAppIcon\"" task failed - NODE_ENV has not been set.'['yellow']
      )
      return
    }

    if (environment.toLowerCase() == "development") {
      grunt.task.run('exec:copy_dev');
      grunt.log.writeln('>> Copying icons from \"dev\"...')
    } else if (environment.toLowerCase() == "staging") {
      grunt.task.run('exec:copy_staging');
      grunt.log.writeln('>> Copying icons from \"staging\"...')
    }
  });

  grunt.registerTask('default', [ 'setAppIcon' ]);
};

补充说明

在名为setAppIcon的自定义任务/函数中,我们使用内置的节点process.env获取当前节点环境

当通过 CLI 运行 $ grunt(使用上面显示的要点),并假设您的 process.env.NODE_ENV 变量尚未设置,或者可能已通过运行 $ unset NODE_ENV 取消设置,您将看到以下消息:

"setAppIcon"" task failed - NODE_ENV has not been set.

但是,如果 process.env.NODE_ENV 变量已设置为 developmentstaging,则文件将按预期复制。

例如,通过 CLI 运行以下任一命令都会成功:

$ export NODE_ENV=development && grunt

$ export NODE_ENV=staging && grunt

您还会看到控制台中记录了以下任一消息:

>> Copying icons from "dev"...

>> Copying icons from "staging"...

在将process.env.NODE_ENV 设置为developmentstaging 之后,只需通过CLI 运行$ grunt,将根据设置的环境复制文件。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2013-02-23
  • 1970-01-01
  • 2020-09-20
  • 2015-07-28
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多