当我的 GraphQL 架构在运行时由 postgraphile(在其自己的容器中)自动生成时,如何将中继编译器作为离线构建步骤运行?
Posted
技术标签:
【中文标题】当我的 GraphQL 架构在运行时由 postgraphile(在其自己的容器中)自动生成时,如何将中继编译器作为离线构建步骤运行?【英文标题】:How do I run relay-compiler as an offline build step, when my GraphQL schema is auto-generated by postgraphile (in its own container) at runtime? 【发布时间】:2020-07-13 12:26:21 【问题描述】:我正在构建一个 Web 应用程序,其文件结构如下所示:
db/
Dockerfile
init/
00-init.sql
graphql/
Dockerfile
app/
Dockerfile
package.json
bin/
www
public/
index.html
index.js
app.js
frontend/
.babelrc
package.json
webpack.config.js
src/
index.jsx
docker-compose.yml
该项目由三个容器组成:db
运行 postgres 服务器,graphql
运行 postgraphile(自动生成 GraphQL 架构并处理 GraphQL 请求),app
是一个快速应用程序。
我的前端代码包含在app/frontend
内的单独包中。通常,我会在该目录中运行npm run build
来调用webpack,将app/frontend/src
的内容构建成app/public/index.js
中的可再分发形式。这样,构建前端是一个离线过程,而应用程序本身只是为前端提供服务。
这是我的困境:我正在尝试将 Relay 支持添加到我的前端。这需要在前端构建中增加一个步骤,即运行中继编译器。但是中继编译器需要 GraphQL 模式。由于我使用的是 postgraphile,因此在离线构建期间我实际上没有架构。 Postgraphile 可以吐出一个模式文件(使用--export-schema-graphql
),但目前我只在容器中运行 postgraphile - 我的 db 容器必须启动并初始化数据库,此时 postgraphile 可以连接并生成一个架构,此时我有一个 graphql.schema 文件...位于 graphql 容器内。但这一切都是在我启动应用程序之后发生的——在此之前我需要一个模式文件,作为离线构建的一部分。
我对 Docker、GraphQL、postgraphile 尤其是 Relay 还是很陌生 - 所以我希望更熟悉这些技术的人能给我一些智慧。我还没有找到很多专门解决使用 Relay 和 postgraphile 的资源。
代替特定的最佳实践,也许更熟悉现代 Web 开发的人可以帮助我整理这些选项:
我是否更新了我的前端,使其完全能够启动 postgres 服务器并运行 postgraphile(仅作为开发依赖项),然后添加一个离线脚本来生成一个 schema.graphql 文件供自己使用?这似乎是一团糟。
我是否更新我的 graphql 容器,以便它始终写出一个模式文件,然后根据需要手动将该文件复制并粘贴到我的前端?
我是否在任何容器外部添加一个额外的进程(每当我的数据库架构发生更改时我会手动运行)(可能通过替代的 docker-compose 文件),以启动我的应用程序堆栈的一个子集,转储出一个graphql模式,然后退出?如果是这样,是否有某种方法可以指示 Docker 容器在主机上写出文件,或者将本地目录挂载到容器是实现此目的的最佳方法?
有没有更好的方法来构建我的项目,首先避免这个问题?我是 Docker 新手,我觉得我的大脑可能只是分为 Docker 前和 Docker 后两种心态。
【问题讨论】:
【参考方案1】:您可以使用graphql-cli's get-schema
从启用了自省的端点下载架构文件。这样您就可以简单地从远程或本地 PostGraphile 端点获取架构。
尽管如此,运行本地版本的 PostGraphile 会非常有益,它可以可靠地重新创建与您的生产架构相同的架构。
【讨论】:
以上是关于当我的 GraphQL 架构在运行时由 postgraphile(在其自己的容器中)自动生成时,如何将中继编译器作为离线构建步骤运行?的主要内容,如果未能解决你的问题,请参考以下文章
使用 ApolloWebserver 时无法在 GraphQL 架构中使用 @cypher
当我在服务器端更新架构时,中继/GraphQL 架构缓存未更新