从自定义路径预加载 env 文件

Posted

技术标签:

【中文标题】从自定义路径预加载 env 文件【英文标题】:Preload the env file from custom path 【发布时间】:2019-10-20 20:22:52 【问题描述】:

我正在尝试在节点应用程序启动时预加载 .env 文件。

我有以下配置,但每当我运行npm run start:dev 时都会出错。

"scripts": 
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "prestart": "npm run build",
    "start": "node .",
    "start:dev": "node -r dotenv/config . dotenv_config_path=/.dev.env",
    "start:test": "node -r dotenv/config . dotenv_config_path=/.test.env",
    "test": "echo \"Error: no test specified\" && exit 1"
  ,

"scripts": 
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "prestart": "npm run build",
    "start": "node .",
    "start:dev": "node -r dotenv/config . dotenv_config_path=./.dev.env",
    "start:test": "node -r dotenv/config . dotenv_config_path=./.test.env",
    "test": "echo \"Error: no test specified\" && exit 1"
  ,

我的应用结构如下所示

我也读过关于不要使用多个配置文件的信息,所以我知道它的缺点,但我只是想试试看它是如何工作的。

任何帮助将不胜感激。谢谢!!!

更新#1 -- 错误

Error: Cannot find module 'C:\Development\index.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:580:15)
    at Function.Module._load (internal/modules/cjs/loader.js:506:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)
    at startup (internal/bootstrap/node.js:285:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! development@1.0.0 start:dev: `node -r dotenv/config index.js dotenv_config_path=/.dev.env`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the development@1.0.0 start:dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\nikhil\AppData\Roaming\npm-cache\_logs\2019-06-05T10_11_48_699Z-debug.log

日志文件---

0 info it worked if it ends with ok
1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe',
1 verbose cli   'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',
1 verbose cli   'run',
1 verbose cli   'start:dev' ]
2 info using npm@6.4.1
3 info using node@v10.13.0
4 verbose run-script [ 'prestart:dev', 'start:dev', 'poststart:dev' ]
5 info lifecycle development@1.0.0~prestart:dev: development@1.0.0
6 info lifecycle development@1.0.0~start:dev: development@1.0.0
7 verbose lifecycle development@1.0.0~start:dev: unsafe-perm in lifecycle true
8 verbose lifecycle development@1.0.0~start:dev: PATH: C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin;C:\Development\node_modules\.bin;
9 verbose lifecycle development@1.0.0~start:dev: CWD: C:\Development
10 silly lifecycle development@1.0.0~start:dev: Args: [ '/d /s /c',
10 silly lifecycle   'node -r dotenv/config index.js dotenv_config_path=/.dev.env' ]
11 silly lifecycle development@1.0.0~start:dev: Returned: code: 1  signal: null
12 info lifecycle development@1.0.0~start:dev: Failed to exec start:dev script
13 verbose stack Error: development@1.0.0 start:dev: `node -r dotenv/config index.js dotenv_config_path=/.dev.env`
13 verbose stack Exit status 1
13 verbose stack     at EventEmitter.<anonymous> (C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\index.js:301:16)
13 verbose stack     at EventEmitter.emit (events.js:182:13)
13 verbose stack     at ChildProcess.<anonymous> (C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\lib\spawn.js:55:14)
13 verbose stack     at ChildProcess.emit (events.js:182:13)
13 verbose stack     at maybeClose (internal/child_process.js:962:16)
13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:251:5)
14 verbose pkgid development@1.0.0
15 verbose cwd C:\Development
16 verbose Windows_NT 10.0.16299
17 verbose argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "start:dev"
18 verbose node v10.13.0
19 verbose npm  v6.4.1
20 error code ELIFECYCLE
21 error errno 1
22 error development@1.0.0 start:dev: `node -r dotenv/config index.js dotenv_config_path=/.dev.env`
22 error Exit status 1
23 error Failed at the development@1.0.0 start:dev script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 1, true ]

【问题讨论】:

你得到的错误是什么? @Rai 用错误和日志文件更新了问题。 node -r dotenv/config dotenv_config_path=./.dev.env 有用吗?首先从命令行尝试这个,然后在你的 package.json 中设置一个脚本 @bracco23 不起作用internal/modules/cjs/loader.js:582 throw err; ^ Error: Cannot find module 'C:\Development\dotenv_config_path=\.test.env' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:580:15) at Function.Module._load (internal/modules/cjs/loader.js:506:25) at Function.Module.runMain (internal/modules/cjs/loader.js:741:12) at startup (internal/bootstrap/node.js:285:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3) 我发现了问题。在 package.json 我只有一个 start:dev 命令尝试启动服务器,但没有 prestart:dev 命令可以构建项目。 start 也有一个预启动,所以那里一切正常。 【参考方案1】:

你可以使用dotenv-cli package,真的好用:

这是我如何使用它的示例:

"create:db:dev:windows": "SET NODE_ENV=development& dotenv -e .env.local sequelize db:create && npx sequelize-cli db:migrate",

【讨论】:

【参考方案2】:

问题出在 package.json 文件中的脚本部分。

没有 prestart:dev 会在启动服务器之前构建项目。

  "scripts": 
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "prestart": "npm run build",
    "prestart:dev": "npm run build",
    "prestart:test": "npm run build",
    "start": "node -r dotenv/config . dotenv_config_path=./.env",
    "start:dev": "node -r dotenv/config . dotenv_config_path=./.env.dev",
    "start:test": "node -r dotenv/config . dotenv_config_path=./.env.test",
    "test": "echo \"Error: no test specified\" && exit 1"
  ,

【讨论】:

以上是关于从自定义路径预加载 env 文件的主要内容,如果未能解决你的问题,请参考以下文章

从自定义预训练模型中删除层

从自定义单元格重新加载表格视图数据

Dataset_factory importerror:Tensorflow 从自定义数据的现有检查点微调预训练模型

UIView:从自定义 XIB 加载导致崩溃

MacVim 无法从自定义 gvimrc 或 vimrc 文件加载设置

Application Insights 从自定义数据源中清除数据