我想用 envoy 部署我的应用程序,以确保停机时间为零。经过一些研究,我发现这个脚本完全符合我的要求。 https://github.com/papertank/envoy-deploy
基本上对于后端一切都运作良好。我能够克隆项目,执行所有命令并将其指向最新项目。之后,我为我的 vue 组件添加了一个新的 npm 任务。这是任务
@task('deployment_assets')
echo 'Running npm'
cd {{ $release }}
sudo npm ci --production
sudo npm audit fix --only=prod
sudo npm run prod
@endtask
为此,我将我的 laravel mix 相关依赖项从 devDependencies 移动到依赖项。
"dependencies": {
"laravel-mix": "^6.0.31",
"resolve-url-loader": "^4.0.0",
"sass": "~1.32.0",
"sass-loader": "^11.0.1",
"vue-loader": "^15.9.5",
"webpack": "^5.23.0"
},
运行任务时,第一个问题发生了,我的 webpack.mix.js 似乎无法读取变量。调用 process.env.APP_URL 时,它返回未定义。这是语法。
if (process.env.APP_URL.match(/https?:\/\/.*\/.+/)) {
mix.setResourceRoot(process.env.APP_URL);
}
这是我的 .env 样子
APP_DEBUG=true
APP_URL=http://homestead.test
在我检查了 laravel mix 问题后,他们建议使用
require('dotenv').config({ path: '~/www/app/.env'});
加载环境变量。
所以我改变 webpack.mix.js 成为
const mix = require('laravel-mix');
require('dotenv').config({ path: '~/code/app/.env'});
好的,它工作了,现在我可以通过 process.env 检索所有变量。任务完成。然后当我导航到我的项目时,发生了第二个问题。
我的 app.js 无法获取 process.env,它在我 console.log(process.env) 时返回 {}
if (process.env.APP_URL.match(/https?:\/\/.*\/.+/)) {
//
}
我可以确认 .env 在那里,否则在运行 npm run prod 时会抛出错误只是不确定为什么它无法在 app.js 中检索 env 变量
我知道这可能不是在生产中编译资产的最佳实践。但这对我来说是必要的,因为我的 vue 组件从 .env 文件共享相同的环境变量,所以我需要在服务器中编译资产以确保它使用生产 .env 文件。
有谁知道如何解决这个问题?