为暂存环境构建时如何忽略 vue.config.js 中的 devServer 设置?

Posted

技术标签:

【中文标题】为暂存环境构建时如何忽略 vue.config.js 中的 devServer 设置?【英文标题】:How to ignore devServer settings in vue.config.js when building for staging environment? 【发布时间】:2019-08-17 09:27:02 【问题描述】:

我正在使用 Vue 构建一个应用程序。我需要 https 在我的本地环境中工作以用于开发和测试目的。我成功创建了必要的证书following this tutorial。为了让开发服务器使用它们,我将server.keyserver.crt 文件复制到我的项目的根目录中,并将rootCA.pem 文件留在~/.ssh 中。我在/etc/hosts 中为我的域添加了一个别名localhost,例如:

127.0.0.1 example.test

然后我在项目的根目录中编辑了vue.config.js,使其看起来像:

const fs = require('fs')

module.exports = 
  devServer: 
    host: 'example.test',
    https: 
      key: fs.readFileSync('./server.key'),
      cert: fs.readFileSync('./server.crt'),
      ca: fs.readFileSync(process.env.HOME + '/.ssh/rootCA.pem')
    
  

这在本地非常好。我的问题出在我的暂存服务器上。

我的登台服务器正在运行 ubuntu (16.04) 并使用 certbot (LetsEncrypt) 安装了一个实际的 SSL 证书(即非自签名)。我的项目是一个静态前端,所以我将nginx 配置为指向/dist 目录并在staging.example.com 上提供该项目。在我在上面的vue.config.js 中添加devServer 配置之前,这一切正常。

期望会发生什么:

当我为暂存构建项目时,即

npm run build -- --mode staging

我希望它会忽略 devServer 配置部分,因为 NODE_ENV === 'production'(在我的 .env.staging 文件中设置)。

实际上发生了什么:

构建过程失败,抱怨:

Error loading vue.config.js:
Error: ENOENT: no such file or directory, open './server.key'

问题:在构建“暂存”或“生产”时,如何让构建过程忽略 vue.config.jsdevServer 部分?

【问题讨论】:

【参考方案1】:

vue.config.js 不会自动检测环境。作为it says in the Vue CLI configuration docs:

如果您需要基于环境的条件行为,或者想要直接改变配置,请使用函数(在设置 env 变量后将进行惰性求值)。该函数接收解析的配置作为参数。在函数内部,你可以直接改变配置,或者返回一个将被合并的对象。

我并没有立即清楚如何实际执行此操作。最终效果如下:

const fs = require('fs')

module.exports = 
  configureWebpack: config => 
    if (process.env.NODE_ENV !== 'production') 
      config.devServer = 
        host: 'qzuku.test',
        // https://medium.freecodecamp.org/how-to-get-https-working-on-your-local-development-environment-in-5-minutes-7af615770eec
        https: 
          key: fs.readFileSync('./qzukuDevServer.key'),
          cert: fs.readFileSync('./qzukuDevServer.crt'),
          ca: fs.readFileSync(process.env.HOME + '/.ssh/rootDevCA.pem')
        
      
    
  

希望这会有所帮助!

【讨论】:

也可以使用三元运算符: devServer: process.env.NODE_ENV === 'development' ? https: key: fs.readFileSync('./certs/cert.key') : undefined 这对我来说也不是很清楚。我什至浏览了文档,但没有看到您链接到的文章!谢谢!

以上是关于为暂存环境构建时如何忽略 vue.config.js 中的 devServer 设置?的主要内容,如果未能解决你的问题,请参考以下文章

Git:忽略跟踪的文件

Azure 网站 - 识别主机插槽

sh 忽略已经暂存的目录

ASP.NET Core 托管环境变量被忽略

“测试”的 husky 预提交钩子未完成

Azure Pipelines Stages (YAML) 上的手动触发器