如何将参数从命令行传递给 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
命令的输出。
如果我们cd
到项目目录并且运行下面的grunt
命令:
grunt copy-zips
在项目目录的根目录中创建以下文件夹 (projects/foobar
)。
结果示例 A
.
├── ...
└── projects
└── foobar
├── file1.zip
├── file2.zip
└── file3.zip
注意 默认 foobar
文件夹已创建,其中包含 *.zip
文件的副本。该文件夹被命名为 foobar
,因为我们没有通过命令行提供参数。
接下来,如果我们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"
},
...
}
如果我们cd
到项目目录并且运行下面的npm
命令:
npm run copy-zips
我们得到与上述 结果示例 A 部分相同的结果。
接下来,如果我们再次 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
我正在尝试使我的工作流程中的某些过程自动化,为了做到这一点,我需要使用一些变量来控制我正在处理的环境。
我将从一个我正在尝试做的简单示例开始,这是一个创建新文件夹并复制一些样板文件的命令。为此,我使用 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
命令的输出。
如果我们
cd
到项目目录并且运行下面的grunt
命令:grunt copy-zips
在项目目录的根目录中创建以下文件夹 (
projects/foobar
)。结果示例 A
. ├── ... └── projects └── foobar ├── file1.zip ├── file2.zip └── file3.zip
注意 默认
foobar
文件夹已创建,其中包含*.zip
文件的副本。该文件夹被命名为foobar
,因为我们没有通过命令行提供参数。接下来,如果我们
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"
},
...
}
如果我们
cd
到项目目录并且运行下面的npm
命令:npm run copy-zips
我们得到与上述 结果示例 A 部分相同的结果。
接下来,如果我们再次 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 bygetopt
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