我是无服务器新手, 到目前为止,我已经能够为应用程序部署和使用
.env
。
然后,在
provider
文件的stage
属性中的serverless.yml
下,我将其更改为不同的阶段。我也做了新的.env.{stage}
.
使用
sls deploy
重新部署后,它仍然读取默认的.env
文件。
文档声明:
框架在服务目录中查找 .env 和 .env.{stage} 文件,然后尝试使用 dotenv 加载它们。如果找到 .env.{stage},则不会加载 .env。如果未明确定义阶段,则默认为 dev.
所以,我还是不明白“如果stage没有明确定义,默认是dev”。如何明确定义它?
dotenv 文件是根据您的舞台属性配置选择的。您需要在 serverless.yaml 中显式定义 stage 属性或在部署命令中设置它。
这将使用 .env.dev 文件
useDotenv: true
provider:
name: aws
stage: dev # dev [default], stage, prod
memorySize: 3008
timeout: 30
或者您通过 deploy 命令设置 stage 属性。 这将使用 .env.prod 文件
sls deploy --stage prod
在您的
serverless.yml
中,您需要在stage
对象中定义provider
属性。
例子:
provider:
name: aws
[...]
stage: prod
2023 年 2 月,我将尝试给出我的解决方案。我正在为 monorepo 使用 Nx 工具(这无关紧要,但以防万一),我正在使用
serverless.ts
代替。
我认为这样做的目的是为了增强开发人员的体验,因为只需
nx run users:serve --stage=test
(在我的情况下使用 Nx)或sls offline --stage=test
和无服务器就可以为特定的加载适当的变量环境
有些人选择在每个环境中使用多个
.env.<stage>
。我试图走这条路,但因为我不是一个优秀的开发人员,所以我无法让它发挥作用。适用于 的方法是在 serverless.ts
内连接变量名称。让我解释一下……
我只使用一个
.env
文件,但根据 --stage
更改变量名称。魔法正在发生serverless.ts
// .env
STAGE_development=test
DB_NAME_development=mycraftypal
DB_USER_development=postgres
DB_PASSWORD_development=abcde1234
DB_PORT_development=5432
READER_development=localhost // this could be aws rds uri per db instances
WRITER_development=localhost // this could be aws rds uri per db instances
# TEST
STAGE_test=test
DB_NAME_test=mycraftypal
DB_USER_test=postgres
DB_PASSWORD_test=abcde1234
DB_PORT_test=5433
READER_test=localhost // this could be aws rds uri per db instances
WRITER_test=localhost // this could be aws rds uri per db instances
// serverless.base.ts or serverless.ts based on your configuration
...
useDotenv: true, // this property is at the root level
...
provider: {
...
stage: '${opt:stage, "development"}', // get the --stage flag value or default to development
...,
environment: {
STAGE: '${env:STAGE_${self:provider.stage}}}',
DB_NAME: '${env:DB_NAME_${self:provider.stage}}',
DB_USER: '${env:DB_USER_${self:provider.stage}}',
DB_PASSWORD: '${env:DB_PASSWORD_${self:provider.stage}}',
READER: '${env:READER_${self:provider.stage}}',
WRITER: '${env:WRITER_${self:provider.stage}}',
DB_PORT: '${env:DB_PORT_${self:provider.stage}}',
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
}
...
}
当一个人使用
useDotenv: true
时,无服务器从 .env
加载您的变量并将它们放入 env
变量中,以便您可以访问它们 env:STAGE
.
现在我可以像这样
stage
动态访问变量${env:DB_PORT_${self:provider.stage}}
。如果您查看 .env
文件,每个变量的末尾都有 ..._<stage>
。通过这种方式,我可以动态检索每个值。
我还在想办法,因为我不想在我的网址中使用
production
这个词,但仍然动态获取值,因为我正在连接这个值${env:DB_PORT_${self:provider.stage}}
...然后实际变量变成 DB_PORT_
而不是 DB_PORT
.