使用本地、纱线工作区依赖项和生产环境(例如 App Engine)环境变量构建?

Posted

技术标签:

【中文标题】使用本地、纱线工作区依赖项和生产环境(例如 App Engine)环境变量构建?【英文标题】:Build with both local, yarn workspace dependencies and production env (e.g. App Engine) env vars? 【发布时间】:2021-08-19 17:19:21 【问题描述】:

我一直致力于通过 Google App Engine 部署全栈应用程序。如果我尝试让 App Engine 从源代码构建,Google 的 buildpacks 显然不知道如何处理我的 Yarn 工作区依赖 URL。所以对于客户端,我只是在本地构建并部署静态资产。没问题。 (这是Deploying yarn workspace monorepo app with internal dependencies to Google App Engine 的部分解决方法,更间接的是How can I deploy to Google App Engine an app that depends on a yarn workspaces without publishing the packages to a npm registry?)

这对客户端来说很好,但我在部署后端时遇到了问题:显然,服务器应该监听 App Engine 环境的 PORT env var。我能想到的唯一方法是部署源代码并允许通过 Google App Engine 构建它;但是,正如我所提到的,这与工作区依赖 URL 不兼容。如果我在部署到 GAE 之前在本地构建节点应用程序,它仍然可以运行(甚至可以执行出口),但是因为它没有在 PORT env var 上侦听,所以服务器不接受任何请求。我不想发布后端的工作区级部门。

我确信有人必须有部署节点应用程序的经验,该应用程序依赖于 Yarn 工作区级依赖项和生产环境范围环境变量。你能给我一些方向吗?

【问题讨论】:

为什么built后端应用无法访问环境变量? 我对 env vars 的引用在构建过程中得到解决(我正在使用 Webpack 5 构建/捆绑节点应用程序)。我从来没有考虑过编写一个在构建后仍会寻找环境变量的应用程序。但是,我认为(可能是错误的)在 App Engine app.yaml 中设置的环境变量是构建环境变量而不是运行时环境变量,因此应用程序需要由 App Engine 构建才能访问这些环境变量。不确定,因为 8081 端口解决方法(如下)不鼓励我更彻底地研究这个????我很想知道我是否错了。 根据cloud.google.com/appengine/docs/standard/nodejs/config/appref,您似乎可以同时拥有build_env_variablesenv_variables。我会尽可能避免构建时配置,因为这意味着您必须为不同的环境构建不同的工件,而不是构建一个并推广它(我在blog.jonrshar.pe/2020/Sep/19/spa-config.html 解释了更多)并且您不需要捆绑服务器- 使用 Webpack 的端代码。 (顺便说一句,我忘了重点是尝试在 app.yaml 中提供 PORT env var。我想这个想法是听PORT 运行时环境变量;但是,正如我所提到的,我不知道该怎么做。) dotenv 是一种简单配置开发环境的好方法,但在生产中这些东西应该来自实际环境。您可能有 Webpack 的 DefinePlugin(参见 github.com/textbook/starter-kit/wiki/…)将环境变量烘焙到您的实际代码中,这是一个问题(尤其是对于应该保密的事情)。 【参考方案1】:

(编辑:最好采用上面 cmets 中 jonrsharpe 描述的范例——即从实际生产环境(即 App Engine)中检索环境变量,而不是将它们烘焙到构建中。)

我只需要监听 8081 端口(也就是说,在本地构建,将 PORT 设置为 8081,然后部署构建的服务器)。也许 8080 被默认服务(在我的例子中是客户端)或者可能被 nginx 占用。我不太确定,但我现在要继续前进。

【讨论】:

以上是关于使用本地、纱线工作区依赖项和生产环境(例如 App Engine)环境变量构建?的主要内容,如果未能解决你的问题,请参考以下文章

纱线安装工作区中单个包的生产依赖项

我可以从本地纱线工作区依赖包中导入“main”:“index.js”文件之外的子模块吗?

解决纱线工作区中的 TypeScript 依赖项

如何保持纱线工作区依赖关系同步

带有纱线工作空间的通用依赖库版本

打开容器世界的大门: DockerPOD 初探