如何从内部设置一些环境变量package.json
以与npm start
类似命令一起使用?
这是我目前在我的package.json
:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
我想NODE_ENV
在启动脚本中设置环境变量(如 ),同时仍然能够仅使用一个命令启动应用程序,npm start
.
如何从内部设置一些环境变量package.json
以与npm start
类似命令一起使用?
这是我目前在我的package.json
:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
我想NODE_ENV
在启动脚本中设置环境变量(如 ),同时仍然能够仅使用一个命令启动应用程序,npm start
.
在脚本命令中设置环境变量:
...
"scripts": {
"start": "node app.js",
"test": "NODE_ENV=test mocha --reporter spec"
},
...
然后process.env.NODE_ENV
在您的应用程序中使用。
注意:这仅适用于Mac 和 Linux。对于 Windows,请参阅注释。
只需使用 NPM 包cross-env。超级容易。适用于 Windows、Linux 和所有环境。请注意,您不使用 && 来移动到下一个任务。您只需设置环境,然后开始下一个任务。感谢@mikekidder在此处的评论之一中提出的建议。
从文档:
{
"scripts": {
"build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
}
}
请注意,如果要设置多个全局变量,只需依次声明它们,然后执行要执行的命令。
最终,执行的命令(使用 spawn)是:
webpack --config build/webpack.config.js
NODE_ENV
环境变量将由 cross-env设置
我只是想在这里为未来的 Node-explorers 添加我的两分钱。在我的 Ubuntu 14.04 上NODE_ENV=test
没有工作,我不得不使用export NODE_ENV=test
之后也NODE_ENV=test
开始工作,很奇怪。
如前所述,在 Windows 上,您必须使用set NODE_ENV=test
,但对于跨平台解决方案,跨环境库似乎并没有解决问题,您是否真的需要一个库来执行此操作:
export NODE_ENV=test || set NODE_ENV=test&& yadda yadda
需要竖线,否则 Windows 会因无法识别的export NODE_ENV
命令而崩溃。我不知道尾随空格,但只是为了确保我也删除了它们。
因为我经常发现自己使用多个环境变量,所以我发现将它们保存在单独的文件中很有用.env
(确保从源代码管理中忽略这一点)。然后(在 Linux 中)export $(cat .env | xargs) &&
在启动应用程序之前添加脚本命令。
示例.env
文件:
VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break
示例index.js
:
console.log('Test', process.env.VAR_A, process.env.VAR_B);
示例package.json
:
{
...
"scripts": {
"start": "node index.js",
"env-linux": "export $(cat .env | xargs) && env",
"start-linux": "export $(cat .env | xargs) && npm start",
"env-windows": "(for /F \"tokens=*\" %i in (.env) do set %i)",
"start-windows": "(for /F \"tokens=*\" %i in (.env) do set %i) && npm start",
}
...
}
不幸的是,我似乎无法通过从脚本调用脚本来设置环境变量——比如"start-windows": "npm run env-windows && npm start"
——所以脚本中有一些冗余。
对于测试,您可以通过运行or来查看环境变量,并通过运行npm run env-linux
ornpm run env-windows
来测试它们是否进入您的应用程序。npm run start-linux
npm run start-windows
通过替换在 Windows 上试试这个YOURENV
:
{
...
"scripts": {
"help": "set NODE_ENV=YOURENV && tagove help",
"start": "set NODE_ENV=YOURENV && tagove start"
}
...
}
这将在Windows 控制台中工作:
"scripts": {
"setAndStart": "set TMP=test&& node index.js",
"otherScriptCmd": "echo %TMP%"
}
npm run aaa
输出:
test
有关详细信息,请参阅此答案。
npm(和 yarn)将大量数据从 package.json 传递到脚本中作为环境变量。用于npm run env
查看所有内容。这记录在https://docs.npmjs.com/misc/scripts#environment中,不仅适用于“生命周期”脚本prepublish
,还适用于npm run
.
您可以访问这些内部代码(例如process.env.npm_package_config_port
在 JS 中),但它们已经可供运行脚本的 shell 使用,因此您也可以将它们作为$npm_...
“脚本”中的扩展访问(unix 语法,可能不适用于 Windows?)。
“配置”部分似乎用于此用途:
"name": "myproject",
...
"config": {
"port": "8010"
},
"scripts": {
"start": "node server.js $npm_package_config_port",
"test": "wait-on http://localhost:$npm_package_config_port/ && node test.js http://localhost:$npm_package_config_port/"
}
这些“配置”字段的一个重要特性是用户可以在不修改 package.json 的情况下覆盖它们!
$ npm run start
> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port
Serving on localhost:8010
$ npm config set myproject:port 8020
$ git diff package.json # no change!
$ cat ~/.npmrc
myproject:port=8020
$ npm run start
> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port
Serving on localhost:8020
请参阅npm config和yarn config文档。
看来 yarn 读取对两者~/.npmrc
都有npm config set
影响,但yarn config set
写入~/.yarnrc
,所以只有 yarn 会看到它:-(
@luke 的答案几乎是我需要的答案!谢谢。
由于选择的答案非常简单(且正确),但很旧,我想提供一种替代方法,用于在运行脚本时从 .env 单独文件中导入变量并修复卢克答案的一些限制。尝试这个:
::: .env 文件 :::
# This way, you CAN use comments in your .env files
NODE_PATH="src/"
# You can also have extra/empty lines in it
SASS_PATH="node_modules:src/styles"
然后,在您的 json 包中,您将创建一个脚本,该脚本将设置变量并在您需要它们的脚本之前运行它:
::: 包.json :::
scripts: {
"set-env": "export $(cat .env | grep \"^[^#;]\" |xargs)",
"storybook": "npm run set-env && start-storybook -s public"
}
grep'ed cat 命令中的正则表达式将清除注释和空行。
&&
不需要“粘合”到npm run set-env
,因为如果您在同一命令中设置变量,则需要这样做。
如果您使用纱线,您可能会看到警告,您可以将其更改为yarn set-env
或使用npm run set-env --scripts-prepend-node-path &&
。
使用它的另一个优点是您可以拥有不同的环境变量。
scripts: {
"set-env:production": "export $(cat .production.env | grep \"^[^#;]\" |xargs)",
"set-env:development": "export $(cat .env | grep \"^[^#;]\" |xargs)",
}
请记住,当您有密钥、密码或敏感/个人数据时,不要将 .env 文件添加到您的 git 存储库中!
对于更大的环境变量集或当您想要重用它们时,您可以使用env-cmd
.
./.env
文件:
# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH
./package.json
:
{
"scripts": {
"test": "env-cmd mocha -R spec"
}
}
突然我发现 actionhero 正在使用以下代码,通过传入--NODE_ENV=production
启动脚本命令选项解决了我的问题。
if(argv['NODE_ENV'] != null){
api.env = argv['NODE_ENV'];
} else if(process.env.NODE_ENV != null){
api.env = process.env.NODE_ENV;
}
我真的很感激接受其他人的回答,他们知道在 package.json 或 init 脚本或类似的东西中设置环境变量的更好方法,其中应用程序由其他人引导。
在 Windows 中使用 git bash。Git Bash 处理命令的方式与 cmd 不同。
当您使用 NODE_ENV=production 设置环境变量时,大多数 Windows 命令提示符都会阻塞。(Windows 上的 Bash 例外,它使用本机 Bash。)同样,Windows 和 POSIX 命令如何利用环境变量也有所不同。在 POSIX 中,您使用:$ENV_VAR,在 Windows 上使用 %ENV_VAR%。- 跨环境文档
{
...
"scripts": {
"help": "tagove help",
"start": "env NODE_ENV=production tagove start"
}
...
}
使用 dotenv 包声明环境变量
对于单个环境变量
"scripts": {
"start": "set NODE_ENV=production&& node server.js"
}
对于多个环境变量
"scripts": {
"start": "set NODE_ENV=production&& set PORT=8000&& node server.js"
}
{
...
"scripts": {
"start": "ENV NODE_ENV=production someapp --options"
}
...
}
当NODE_ENV
环境变量设置为“生产”package.json
时,运行 npm install 时文件中的所有 devDependencies 将被完全忽略。您还可以使用--production
标志强制执行此操作:
npm install --production
对于设置NODE_ENV
,您可以使用这些方法中的任何一种
方法一:NODE_ENV
为所有节点应用设置
Windows
:
set NODE_ENV=production
Linux, macOS or other unix
基于系统:
export NODE_ENV=production
这将为当前 bash 会话设置 NODE_ENV,因此在此语句之后启动的任何应用程序都将 NODE_ENV 设置为生产。
方法2:NODE_ENV
为当前应用设置
NODE_ENV=production node app.js
这将NODE_ENV
仅为当前应用程序设置。当我们想在不同的环境中测试我们的应用程序时,这会有所帮助。
方法3:创建.env
文件并使用它
这使用了这里解释的想法。有关更详细的说明,请参阅此帖子。
基本上,您创建一个 .env 文件并运行一些 bash 脚本以在环境中设置它们。
为了避免编写 bash 脚本,可以使用 env-cmd 包来加载 .env 文件中定义的环境变量。
env-cmd .env node app.js
方法4:使用cross-env package
这个包允许为每个平台以一种方式设置环境变量。
使用 npm 安装后,您可以将其添加到 package.json 中的部署脚本中,如下所示:
"build:deploy": "cross-env NODE_ENV=production webpack"
虽然没有直接回答这个问题,但我想在其他答案之上分享一个想法。从我得到的每一个都会提供一定程度的复杂性来实现跨平台的独立性。
在我的场景中,我最初想要设置一个变量来控制是否使用 JWT 身份验证来保护服务器(用于开发目的)
阅读答案后,我决定简单地创建 2 个不同的文件,分别打开和关闭身份验证。
"scripts": {
"dev": "nodemon --debug index_auth.js",
"devna": "nodemon --debug index_no_auth.js",
}
这些文件只是调用原始 index.js 文件(我将其重命名为appbootstrapper.js
)的包装器:
//index_no_auth.js authentication turned off
const bootstrapper = require('./appbootstrapper');
bootstrapper(false);
//index_auth.js authentication turned on
const bootstrapper = require('./appbootstrapper');
bootstrapper(true);
class AppBootStrapper {
init(useauth) {
//real initialization
}
}
也许这可以帮助别人
你不应该在package.json
. actionhero 用于NODE_ENV
允许您更改从./config
. 查看redis 配置文件,了解如何使用 NODE_ENV 更改数据库选项NODE_ENV=test
如果你想使用其他 ENV 变量来设置东西(可能是 HTTP 端口),你仍然不需要在package.json
. 例如,如果您PORT=1234
在 ENV 中设置并希望将其用作 中的 HTTP 端口NODE_ENV=production
,只需在相关配置文件 IE 中引用它:
# in config/servers/web.js
exports.production = {
servers: {
web: function(api){
return {
port: process.env.PORT
}
}
}
}
最优雅和便携的解决方案
package.json
::
"scripts": {
"serve": "export NODE_PRESERVE_SYMLINKS_MAIN=1 && vue-cli-service serve"
},
在windows
创建下export.cmd
并将其放在您的某处%PATH%
:
@echo off
set %*
注意:为了设置多个环境变量,脚本应该是这样的
"scripts": {
"start": "set NODE_ENV=production&& set MONGO_USER=your_DB_USER_NAME&& set MONGO_PASSWORD=DB_PASSWORD&& set MONGO_DEFAULT_DATABASE=DB_NAME&& node app.js",
},