VueJS 在文件夹中放置多个 .env
VueJS place multiple .env in folder
你好,我正在使用 VueJS 2,我的项目中有多个 .env。
我的应用程序有每个公司的 .env select 公司配置(肤色/文件...)
实际上我的所有 .env 都在根文件夹中:
.env.company1-dev
.env.company1-staging
.env.company1-prod
.env.company2-dev
.env.company2-staging
.env.company2-prod
.env.company3-dev
.env.company3-staging
.env.company3-prod
所以当我得到 20 家公司时,它会混淆我的根文件夹,所以可以创建一个文件夹来放置我所有的 .env 吗?
想法:
/environments/company1/
.env.dev
.env.staging
.env.prod
/environments/company2/
.env.dev
.env.staging
.env.prod
/environments/company3/
.env.dev
.env.staging
.env.prod
在您的 vue.config.js
文件中,您可以添加:
const dotenv = require("dotenv");
const path = require("path");
let envfile = ".env";
if (process.env.NODE_ENV) {
envfile += "." + process.env.NODE_ENV;
}
const result = dotenv.config({
path: path.resolve(`environments/${process.env.VUE_APP_COMPANY}`, envfile)
});
// optional: check for errors
if (result.error) {
throw result.error;
}
在 运行 之前,您可以将 VUE_APP_COMPANY
设置为公司名称和 运行 您的应用程序,
Note: It's important to put this code on vue.config.js
and not in main.js
because dotenv will use fs
to read files.
参考资料
我们过去也使用过的公认答案。但是我找到了一个更好的解决方案来处理不同的环境。使用 npm 包 dotenv-flow 不仅允许使用不同的环境,而且还有更多好处,例如:
- 使用
.env.local
或.env.staging.local
等局部覆盖变量
- 使用
.env.defaults
定义默认值
结合我们使用以下配置设置我们的项目:
.env
.env.defaults
.env.development
.env.production
.env.staging
.env.test
在 vue.config.js
、nuxt.config.js
或其他入口点,您唯一需要做的就是
require('dotenv-flow').config()
powershell解决方案
我正在处理完全相同的问题。公认的解决方案还可以,但它并没有解决公司之间的所有差异。此外,如果您使用 npm,您的脚本可能看起来很糟糕。所以如果你有 powershell,这就是我的建议 - 去掉 .env 文件 :)
你可以在问题中保持你想要的结构。只需将 env 文件转换为 ps1.
/build/company1/
build-dev.ps1
build-stage.ps1
build-prod.ps1
/build/company2/
build-dev.ps1
build-stage.ps1
build-prod.ps1
在其中的每一个中,您都可以完全自定义所有 env 变量,运行 构建过程并应用一些高级 post-build 逻辑(例如小心 auto-deploy、发布、与 api 项目,..).
例如 company1\build-stage.ps1 可以是这样的:
# You can pass some arguments to the script
param (
[string]$appName = "company1"
)
# Set environment variables for vue pipeline
$env:VUE_APP_ENVIRONMENT = "company1-stage";
$env:NODE_ENV="development";
$env:VUE_APP_NAME=$appName;
$env:VUE_APP_API_BASE_URL="https://company1.stage.mycompany.com"
# Run the vue pipeline build
vue-cli-service build;
# Any additional logic e.g.
# Copy-Item -Path "./dist" -Destination "my-server/my-app" -Recurse¨
最后一部分很简单 - 只需调用它(手动或从 TeamCity 等集成服务)。或者,你可以把它放在 package.json.
里面
...
"scripts": {
"build-company1-stage": "@powershell -Command ./build/company1/build-stage.ps1 -appName Company-One",
}
...
您只需调用
即可调用整个构建过程
npm run build-company1-stage
同样,您可以创建localhost、dev、prod、test等任何环境。让 javascript 处理构建应用程序本身的部分。对于其他高级工作,请使用 poweshell。我认为此解决方案为您提供了更大的配置和构建过程灵活性。
P.S。
我知道这样我会合并配置和构建过程,但如果文件变大,您始终可以将配置提取到文件之外。
你好,我正在使用 VueJS 2,我的项目中有多个 .env。 我的应用程序有每个公司的 .env select 公司配置(肤色/文件...)
实际上我的所有 .env 都在根文件夹中:
.env.company1-dev
.env.company1-staging
.env.company1-prod
.env.company2-dev
.env.company2-staging
.env.company2-prod
.env.company3-dev
.env.company3-staging
.env.company3-prod
所以当我得到 20 家公司时,它会混淆我的根文件夹,所以可以创建一个文件夹来放置我所有的 .env 吗?
想法:
/environments/company1/
.env.dev
.env.staging
.env.prod
/environments/company2/
.env.dev
.env.staging
.env.prod
/environments/company3/
.env.dev
.env.staging
.env.prod
在您的 vue.config.js
文件中,您可以添加:
const dotenv = require("dotenv");
const path = require("path");
let envfile = ".env";
if (process.env.NODE_ENV) {
envfile += "." + process.env.NODE_ENV;
}
const result = dotenv.config({
path: path.resolve(`environments/${process.env.VUE_APP_COMPANY}`, envfile)
});
// optional: check for errors
if (result.error) {
throw result.error;
}
在 运行 之前,您可以将 VUE_APP_COMPANY
设置为公司名称和 运行 您的应用程序,
Note: It's important to put this code on
vue.config.js
and not inmain.js
because dotenv will usefs
to read files.
参考资料
我们过去也使用过的公认答案。但是我找到了一个更好的解决方案来处理不同的环境。使用 npm 包 dotenv-flow 不仅允许使用不同的环境,而且还有更多好处,例如:
- 使用
.env.local
或.env.staging.local
等局部覆盖变量 - 使用
.env.defaults
定义默认值
结合我们使用以下配置设置我们的项目:
.env
.env.defaults
.env.development
.env.production
.env.staging
.env.test
在 vue.config.js
、nuxt.config.js
或其他入口点,您唯一需要做的就是
require('dotenv-flow').config()
powershell解决方案
我正在处理完全相同的问题。公认的解决方案还可以,但它并没有解决公司之间的所有差异。此外,如果您使用 npm,您的脚本可能看起来很糟糕。所以如果你有 powershell,这就是我的建议 - 去掉 .env 文件 :)
你可以在问题中保持你想要的结构。只需将 env 文件转换为 ps1.
/build/company1/
build-dev.ps1
build-stage.ps1
build-prod.ps1
/build/company2/
build-dev.ps1
build-stage.ps1
build-prod.ps1
在其中的每一个中,您都可以完全自定义所有 env 变量,运行 构建过程并应用一些高级 post-build 逻辑(例如小心 auto-deploy、发布、与 api 项目,..).
例如 company1\build-stage.ps1 可以是这样的:
# You can pass some arguments to the script
param (
[string]$appName = "company1"
)
# Set environment variables for vue pipeline
$env:VUE_APP_ENVIRONMENT = "company1-stage";
$env:NODE_ENV="development";
$env:VUE_APP_NAME=$appName;
$env:VUE_APP_API_BASE_URL="https://company1.stage.mycompany.com"
# Run the vue pipeline build
vue-cli-service build;
# Any additional logic e.g.
# Copy-Item -Path "./dist" -Destination "my-server/my-app" -Recurse¨
最后一部分很简单 - 只需调用它(手动或从 TeamCity 等集成服务)。或者,你可以把它放在 package.json.
里面...
"scripts": {
"build-company1-stage": "@powershell -Command ./build/company1/build-stage.ps1 -appName Company-One",
}
...
您只需调用
即可调用整个构建过程npm run build-company1-stage
同样,您可以创建localhost、dev、prod、test等任何环境。让 javascript 处理构建应用程序本身的部分。对于其他高级工作,请使用 poweshell。我认为此解决方案为您提供了更大的配置和构建过程灵活性。
P.S。 我知道这样我会合并配置和构建过程,但如果文件变大,您始终可以将配置提取到文件之外。