如何从Grunt任务函数运行shell命令

时间:2017-10-29 20:24:10

标签: javascript node.js gruntjs

我正在尝试根据我Gruntfile.js内部的功能在我的应用目录中移动一些图标。可以这样做吗?我已经尝试了以下(进入开发或暂存文件夹并将所有文件复制到上一个目录),但是不能让它工作。提前谢谢。

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 . ../']);

    } 
});

1 个答案:

答案 0 :(得分:1)

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

如果你定义一个单独的Target(让他们打电话给他们copy_devcopy_staging - 如下例所示),对于grunt-exec任务中的每个cd ... && cp ...命令,它应该可以成功运行。

<强> 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后,将根据设置的环境复制文件。