luk*_*r02 5 cross-platform npm npm-scripts
在 Windows 或 Linux 中,我想要一种将 args 传递给 a 的方法npm script,但将它们作为环境变量注入
从命令行,我会以这种方式启动我的项目:
npm run start -- --env=dev --host=localhost --port=1234
Run Code Online (Sandbox Code Playgroud)
为了使用我的 cli 参数并将它们作为环境变量注入(无论平台如何),我使用了cross-env npm 包:
包.json
"scripts": {
"start": "cross-env env=%env% host=%host% port=%port% my-app"
},
Run Code Online (Sandbox Code Playgroud)
我知道上面的语法无效,但是该start脚本是否可以以某种方式消耗我传递的参数而不是将它们转发到my-app?
不幸的是,npm 没有、也不打算提供允许将参数传递到 npm 脚本中间的内置功能(如此处所述)。参数只能传递到脚本的末尾。
对于 Linux 和 macOS,您可以利用npm-scripts 中的bash 函数将参数传递到脚本的中间,按照我的回答此处。然而,Windows 会对这样的解决方案感到窒息。
由于需要跨平台兼容性,请考虑将start脚本中当前的逻辑移动到单独的 Nodejs 实用程序脚本中。然后可以通过名为 的 npm-script 调用 nodejs 脚本start。
下面介绍如何以跨平台兼容的方式实现您的需求。
创建一个nodejs脚本,如下所示。我们将脚本命名为start.js并将其保存在项目目录的根目录中,即与package.json文件当前所在的同一级别。
const execSync = require('child_process').execSync;
const args = process.argv.splice(2, process.argv.length - 2)
.map(arg => arg.replace(/^--/, ''));
execSync(`cross-env ${args.join(' ')} my-app`, {stdio:[0, 1, 2]});
Run Code Online (Sandbox Code Playgroud)
解释:
在第一行中,我们require节点内置execSync()。我们将利用它来运行cross-env和设置环境变量。
内置节点process.argv获取通过命令行传递的参数。节点中的前两项process.argv是:
但是,我们只对数组中第三项以后的元素感兴趣 - 因为这些将是通过 CLI 传递的参数。这些行内容如下:
const args = process.argv.splice(2, process.argv.length - 2)
.map(arg => arg.replace(/^--/, ''));
Run Code Online (Sandbox Code Playgroud)
创建一个args变量并分配一个包含通过 CLI 传递的每个参数的数组。使用该方法从数组中省略第 2 点中的前两项splice()。在该map()方法中,我们--从每个参数中删除前缀。
最后一行读取:
execSync(`cross-env ${args.join(' ')} my-app`, {stdio:[0, 1, 2]});
Run Code Online (Sandbox Code Playgroud)
使用模板文字和数组方法调用cross-env参数并将其放置为字符串。该部分在子进程中为, ,配置管道。join()stdiostdinstdoutstderr
注意:如果您的目标是不支持模板文字的旧版本节点,那么您可以用以下内容替换此行。这使用运算符处理字符串连接+:
execSync('cross-env ' + args.join(' ') + ' my-app', {stdio:[0, 1, 2]});
Run Code Online (Sandbox Code Playgroud)
同样,如果不支持 ES6 箭头函数,请更改map()为使用标准函数。例如:
.map(function(arg) {
return arg.replace(/^--/, '');
});
Run Code Online (Sandbox Code Playgroud)
start在package.json中重新定义脚本,如下所示:
execSync(`cross-env ${args.join(' ')} my-app`, {stdio:[0, 1, 2]});
Run Code Online (Sandbox Code Playgroud)
这里我们要求节点调用start.js脚本。
注意如果您希望将start.js文件保存在与上述项目目录根目录不同的目录位置,则需要根据需要定义start.js的路径。该路径应该相对于package.json。例如:
execSync('cross-env ' + args.join(' ') + ' my-app', {stdio:[0, 1, 2]});
Run Code Online (Sandbox Code Playgroud)
start可以通过 CLI 运行以下命令来调用npm脚本:
.map(function(arg) {
return arg.replace(/^--/, '');
});
Run Code Online (Sandbox Code Playgroud)
调用 npm 脚本时不需要runie部分。npm run start ...start
| 归档时间: |
|
| 查看次数: |
5849 次 |
| 最近记录: |