使用 serverless-dotenv-plugin 正确的 .env 文件

问题描述 投票:0回答:3

我使用以下内容作为自定义

serverless-dotenv-plugin
插件配置:


custom:
  dotenv:
    path: .env-${opt:stage, 'local'}

但我真正想要得到的是,当我不提供参数时,从

.env
文件加载环境;当我使用
.env.staging
作为 CLI 参数时,从
staging
文件加载环境。

我不知道这如何反映在上面的

path
中。请问有什么帮助吗?

serverless-framework serverless serverless-plugins
3个回答
5
投票

我是 serverless-dotenv-plugin 的作者。尝试从提供程序或其他选项动态加载环境文件时出现逻辑问题。不过,我已经更新了插件,以便您可以根据设置的环境动态加载 env 文件。

例如,如果您运行“NODE_ENV=生产 sls 部署”,它将查找名为 .env.Production 的文件。如果没有找到,它将回退到 .env。

有关更多详细信息,请参阅自述文件 https://github.com/infrontlabs/serverless-dotenv-plugin


3
投票

我只需使用普通的 dotenv 插件即可让您的用例正常工作。

在我的

serverless.yaml
中,我根据
stage
参数指定要从文件加载的环境变量(
dev
是默认值):

provider: 
  stage: ${opt:stage, 'dev'}
  environment:
    FOO: ${file(./config.${self:provider.stage}.js):getEnvVars.FOO}
    BAR: ${file(./config.${self:provider.stage}.js):getEnvVars.BAR}

然后每个阶段一个文件从右侧加载环境变量

.env file
:

config.dev.js

require('dotenv').config({path: __dirname + '/dev.env'});
const config = require('./environmentVariables.js');
module.exports.getEnvVars = config.getEnvVars;

config.production.js

require('dotenv').config({path: __dirname + '/production.env'});
const config = require('./environmentVariables.js');
module.exports.getEnvVars = config.getEnvVars;

我没有导出上述每个配置文件中的每个环境变量,而是为此创建了一个帮助文件(

environmentVariables.js
):

module.exports.getEnvVars = () => ({
    FOO: process.env.FOO,
    BAR: process.env.BAR
});

最后但并非最不重要的是包含实际变量的

.env
文件。我将文件命名为
dev.env
production.env

FOO=foo
BAR=bar

它的工作原理就像一个魅力,唯一的缺点是每当你想添加新的环境变量时,你都必须编辑几个不同的文件。


0
投票

不幸的是,

serverless-dotenv-plugin
插件不再工作得很好,因为无服务器现在在处理插件之前加载环境变量。请参阅插件自述文件中的常见问题解答部分

为了解决这个问题,我使用 dotenvx 从与 serverless.yml 不同的文件夹中的 .env 文件加载环境变量,并将它们传递给正在运行的不同脚本/命令。

示例:

// package.json
{
  "scripts": {
    "start": "dotenvx run -f path/to/.env -- sls offline start"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.