npm - 将环境变量作为参数传递给 npm 脚本的跨平台方式
问题描述
在 Windows 或 Linux 中,我想要一种将 args 传递给 a 的方法npm script
,但将它们作为环境变量注入
从命令行,我会以这种方式开始我的项目:
npm run start -- --env=dev --host=localhost --port=1234
为了使用我的 cli args 并将它们作为 env 变量注入而不考虑平台,我使用了cross-env npm 包:
包.json
"scripts": {
"start": "cross-env env=%env% host=%host% port=%port% my-app"
},
我知道上面的语法无效,但是该start
脚本可以以某种方式消耗我传递的参数而不是将它们转发到my-app
吗?
解决方案
不幸的是,npm 没有也不打算提供允许将参数传递到 npm 脚本中间的内置功能(如此处所述)。参数只能传递到脚本的末尾。
对于 Linux 和 macOS,您可以使用npm-scripts 中的bash 函数将参数传递到脚本的中间,根据我在此处的回答。然而,Windows 会因这样的解决方案而窒息。
由于跨平台兼容性是一项要求,请考虑将当前start
脚本中的逻辑移动到单独的 nodejs 实用程序脚本中。然后可以通过名为 的 npm-script 调用 nodejs 脚本start
。
下面介绍如何以跨平台兼容的方式实现您的需求。
1.自定义nodejs实用脚本。
创建一个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]});
解释:
在第一行中,我们使用
require
内置节点execSync()
。我们将利用它来运行cross-env
和设置环境变量。内置节点
process.argv
获取通过命令行传递的参数。节点中的前两项process.argv
是:- 运行 JavaScript 文件的可执行文件的路径。
- 正在执行的 JavaScript 文件的路径。
但是,我们只对数组中第三项以后的元素感兴趣——因为这些将是您通过 CLI 传递的参数。这些行读;
const args = process.argv.splice(2, process.argv.length - 2) .map(arg => arg.replace(/^--/, ''));
创建一个
args
变量并分配一个包含通过 CLI 传递的每个参数的数组。splice()
使用该方法从数组中省略了第 2 点中的前两项。在该map()
方法中,我们--
从每个参数中删除前缀。最后一行阅读:
execSync(`cross-env ${args.join(' ')} my-app`, {stdio:[0, 1, 2]});
使用Template Literals和 Array方法调用
cross-env
并将参数作为字符串放置。该部分在子进程中为、、配置管道。join()
stdio
stdin
stdout
stderr
注意:如果您的目标是不支持模板文字的旧版本节点,那么您可以将此行替换为以下内容。这使用运算符处理字符串连接+
:
execSync('cross-env ' + args.join(' ') + ' my-app', {stdio:[0, 1, 2]});
同样,如果不支持 ES6 箭头函数,则将 更改map()
为使用标准函数。例如:
.map(function(arg) {
return arg.replace(/^--/, '');
});
2. package.json 脚本。
重新定义package.jsonstart
中的脚本,如下所示:
"scripts": {
"start": "node start"
},
在这里,我们要求节点调用start.js脚本。
注意如果您希望将start.js文件保存在与上述项目目录的根目录不同的目录位置,则需要根据需要定义start.js的路径。路径应该是相对于package.json的。例如:
"scripts": {
"start": "node ./the/path/to/start"
},
3. 运行 npm 脚本。
start
可以通过 CLI 调用npm脚本,方法是运行:
$ npm start -- --env=dev --host=localhost --port=1234
调用 npm的脚本时不需要run
ie 部分。npm run start ...
start
推荐阅读
- python - Django REST serializer.is_valid() 返回 False
- c# - 如何在 Visual Studio 2019 中创建与 Visual Studio 2015 兼容的扩展?
- javascript - 等待和 AddContext Promise 错误 Cypress
- c++ - 协程可以返回 std::future 吗?(无法找到此协程的承诺类型)
- email - 如何在 Cypress 中发送带有测试报告的电子邮件
- javascript - 从 Chrome 扩展访问 Vue 组件方法
- metal - 在 Metal Debugger 中捕获精确的帧
- c# - C# Outlook 加载项 > 约会所有者 > 检索 Active Directory 帐户
- python - set() 函数打乱了列表的顺序
- python - 是否可以将浮点值的 1 元素列表转换为浮点值数组?