0

我正在构建一个 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/srcapp/public/index.js. 这样,构建前端是一个离线过程,而应用程序本身只是为前端提供服务。

这是我的困境:我正在尝试将 Relay 支持添加到我的前端。这需要在前端构建中增加一个步骤,即运行中继编译器。但是中继编译器需要 GraphQL 模式。由于我使用的是 postgraphile,因此在离线构建期间我实际上没有架构。--export-schema-graphqlPostgraphile可以吐出一个模式文件(带哪一点我有一个 graphql.schema 文件......坐在 graphql 容器内。但这一切都是在我启动应用程序之后发生的——在此之前我需要一个模式文件,作为离线构建的一部分。

我对 Docker、GraphQL、postgraphile 尤其是 Relay 还是很陌生——所以我希望更熟悉这些技术的人能给我一些智慧。我还没有找到很多专门解决使用 Relay 和 postgraphile 的资源。

代替特定的最佳实践,也许更熟悉现代 Web 开发的人可以帮助我整理这些选项:

  • 我是否更新了我的前端,使其完全能够启动 postgres 服务器并运行 postgraphile(仅作为开发依赖项),然后添加一个生成 schema.graphql 文件供自己使用的离线脚本?这似乎是一个大麻烦。

  • 我是否更新了我的 graphql 容器,以便它始终写出一个模式文件,并根据需要手动将该文件复制并粘贴到我的前端?

  • 我是否在任何容器外部添加一个额外的进程(每当我的数据库模式发生变化时我都会手动运行)(可能通过一个替代的 docker-compose 文件),它启动了我的应用程序堆栈的一个子集,转储出一个 graphql 模式,然后退出?如果是这样,是否有某种方法可以指示 Docker 容器在主机上写出文件,或者将本地目录挂载到容器中是实现此目的的最佳方法?

  • 有没有更好的方法来构建我的项目来避免这个问题?我是 Docker 的新手,我觉得我的大脑可能只是分为 Docker 前和 Docker 后两种心态。

4

1 回答 1

1

您可以使用graphql-cli get-schema从启用了自省的端点下载模式文件。这样,您可以简单地从远程或本地 PostGraphile 端点获取架构。

尽管如此,运行本地版本的 PostGraphile 以可靠地重新创建与生产模式相同的模式是非常有益的。

于 2020-04-01T20:06:21.220 回答