0

我想用 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 文件。

有谁知道如何解决这个问题?

4

1 回答 1

0

好了,经过一些故障排除,可以确认获取mix中的环境变量,以MIX_为前缀是必须的。确保在替换 .env 变量之后运行 php artisan config:cache 以使变量是最新版本,一开始我很困惑为什么在删除前缀 MIX_ 后它仍然有效,原来这是缓存问题。

于 2021-11-11T07:10:34.300 回答