如何将参数从命令行传递给 npm 和 grunt?

How to pass arguments from command line to npm and grunt?

我正在尝试使我的工作流程中的某些过程自动化,为了做到这一点,我需要使用一些变量来控制我正在处理的环境。

我将从一个我正在尝试做的简单示例开始,这是一个创建新文件夹并复制一些样板文件的命令。为此,我使用 npm 和 g运行t,如下所示:

package.json

"scripts": {
  "new": "grunt new --target
},

grunt.js

module.exports = function (grunt) {
  const target = grunt.option('target');
  console.log('Target: ', target);

  grunt.config.set('copy', {
    new: {
      files: [{
        expand: true,
        cwd: 'assets/zip',
        src: '*.zip',
        dest: 'projects/',
      }]
    },
  });
}

我想这样称呼它:

npm run new --target:my-folder-name

This is just a simple example, I'm running other scripts such as unzip files, rename, copy, process scss, etc...

我期望的任务是 运行 将文件复制到名为 my-folder-name 的文件夹,但它没有发生。控制台正在打印 true,而不是文件夹名称。

我需要做什么才能将参数传递给脚本?

假设我们设计的项目目录结构如下:

.
├── Gruntfile.js
├── assets
│   └── zip
│       ├── file1.zip
│       ├── file2.zip
│       └── file3.zip
├── node_modules
│   └── ...
└── package.json

然后考虑以下 Gruntfile.js 使用 grunt-contrib-copy 的示例:

Gruntfile.js

module.exports = function(grunt) {

  const target = grunt.option('target') || 'foobar'; // default dir is `foobar`.

  grunt.loadNpmTasks('grunt-contrib-copy');


  grunt.initConfig({
    copy: {
      zips: {
        files: [{
          expand: true,
          cwd: 'assets/zip',
          src: '*.zip',
          dest: 'projects/' + target
        }]
      }
    }
  });

  grunt.registerTask('copy-zips', [ 'copy:zips' ]);

};

通过grunt命令的输出。

  1. 如果我们cd到项目目录并且运行下面的grunt命令:

    grunt copy-zips
    

    在项目目录的根目录中创建以下文件夹 (projects/foobar)。

    结果示例 A

    .
    ├── ...
    └── projects
        └── foobar
            ├── file1.zip
            ├── file2.zip
            └── file3.zip
    

    注意 默认 foobar 文件夹已创建,其中包含 *.zip 文件的副本。该文件夹被命名为 foobar,因为我们没有通过命令行提供参数。

  2. 接下来,如果我们cd再次进入工程目录,运行下面的g运行t命令:

    grunt copy-zips --target=my-folder-name
    

    在项目目录的根目录中创建以下文件夹 (projects/my-folder-name)。

    结果示例 B

    .
    ├── ...
    └── projects
        └── my-folder-name
            ├── file1.zip
            ├── file2.zip
            └── file3.zip
    

    注意 这次创建了 my-folder-name 文件夹,其中包含 *.zip 文件的副本,因为我们提供了 --target=my-folder-name argument/option.

通过npm命令的输出。

首先让我们在项目package.json中配置scripts部分如下:

包,json

{
  ...
  "scripts": {
    "copy-zips": "grunt copy-zips"
  },
  ...
}

  1. 如果我们cd到项目目录并且运行下面的npm命令:

    npm run copy-zips
    

    我们得到与上述 结果示例 A 部分相同的结果。

  2. 接下来,如果我们再次 cd 到项目目录并 运行 下面的 npm 命令:

    npm run copy-zips -- --target=my-folder-name
    

    我们得到与上述 结果示例 B 部分相同的结果。

    注意: npm run copy-zips 和参数 --target=my-folder-name 之间的附加 -- 选项。

    npm docs 描述 -- 选项如下:

    As of npm@2.0.0, you can use custom arguments when executing scripts. The special option -- is used by getopt to delimit the end of the options. npm will pass all the arguments after the -- directly to your script:


补充说明:

如果您不想在 projects 文件夹中创建 my-folder-name 文件夹,而是想在项目目录的根目录中创建 my-folder-name 文件夹,那么你可以在copy任务中重新定义dest属性如下:

Gruntfile.js

  // ...

  grunt.initConfig({
    copy: {
      zips: {
        files: [{
          expand: true,
          cwd: 'assets/zip',
          src: '*.zip',
          dest: target // <-----
        }]
      }
    }
  });

  // ...

运行同样的命令:

npm run copy-zips -- --target=my-folder-name

产生以下结果:

.
├── ...
└── my-folder-name
    ├── file1.zip
    ├── file2.zip
    └── file3.zip