如何使用grunt-run执行npm脚本?

时间:2017-11-15 05:15:38

标签: node.js reactjs npm gruntjs jestjs

我的package.json文件中有一个npm任务,如下所示执行jest测试:

  "scripts": {
    "test-jest": "jest",
    "jest-coverage": "jest --coverage"
  },
  "jest": {
    "testEnvironment": "jsdom"
  },

我想使用grunt执行此任务npm run test-jest。我为此安装了grunt-run并添加了运行任务,但是如何在那里调用这个npm任务?

    run: {
        options: {
          // Task-specific options go here.
        },
        your_target: {
          cmd: 'node'
        }
      }

1 个答案:

答案 0 :(得分:10)

Gruntfile.js配置为类似于文档中显示的example

  1. cmd的值设置为npm
  2. run数组中设置test-jestargs
  3. <强> Gruntfile.js

    module.exports = function (grunt) {
    
      grunt.loadNpmTasks('grunt-run');
    
      grunt.initConfig({
        run: {
          options: {
            // ...
          },
          npm_test_jest: {
            cmd: 'npm',
            args: [
              'run',
              'test-jest',
              '--silent'
            ]
          }
        }
      });
    
      grunt.registerTask('default', [ 'run:npm_test_jest' ]);
    
    };
    

    <强>运行

    使用上面显示的配置通过CLI运行$ grunt将调用npm run test-jest命令。

    注意:将--silent(或它的简写等效-s)添加到args数组只会有助于避免额外的npm日志到控制台。

    修改

    跨平台

    通过grunt-run运行时,在Windows操作系统上使用上面显示的cmd.exe解决方案失败。抛出以下错误:

      

    Error: spawn npm ENOENT Warning: non-zero exit code -4058 Use --force to continue.

    对于跨平台解决方案,请考虑安装并使用grunt-shell来调用npm run test-jest

    npm i -D grunt-shell

    <强> Gruntfile.js

    module.exports = function (grunt) {
    
      require('load-grunt-tasks')(grunt); // <-- uses `load-grunt-tasks`
    
      grunt.initConfig({
        shell: {
          npm_test_jest: {
            command: 'npm run test-jest --silent',
          }
        }
      });
    
      grunt.registerTask('default', [ 'shell:npm_test_jest' ]);
    
    };
    

    备注

    1. grunt-shell需要load-grunt-tasks来加载任务而不是典型的grunt.loadNpmTasks(...),因此您也需要安装它:
    2. npm i -D load-grunt-tasks

      1. 对于旧版本的Windows,我必须安装较早版本的grunt-shell,即版本1.3.0,因此我建议安装较早版本。
      2. npm i -D grunt-shell@1.3.0

        编辑2

        如果您使用grunt-run密钥而不是execcmd密钥,

        args似乎在Windows上运行... < / p>

        出于跨平台目的......我发现有必要使用exec密钥将命令指定为单个字符串,其文档如下:

          

        如果您想将命令指定为单个字符串,则非常有用   要在一个任务中指定多个命令,请使用exec:key

        <强> Gruntfile.js

        module.exports = function (grunt) {
        
          grunt.loadNpmTasks('grunt-run');
        
          grunt.initConfig({
            run: {
              options: {
                // ...
              },
              npm_test_jest: {
                exec: 'npm run test-jest --silent' // <-- use the exec key.
              }
            }
          });
        
          grunt.registerTask('default', [ 'run:npm_test_jest' ]);
        
        };