我正在构建一个网络应用,其文件结构如下所示:
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
中的可再发行形式。这样,构建前端是一个脱机过程,而应用程序本身只是为前端提供服务。
这是我的两难选择:我正在尝试向我的前端添加中继支持。这需要在前端构建中执行其他步骤,即运行中继编译器。但是中继编译器需要GraphQL模式。由于我使用的是postgraphile,因此在离线构建过程中实际上没有架构。 Postgraphile可以吐出一个模式文件(使用--export-schema-graphql
),但是到目前为止,我只在容器内运行postgraphile-我的db容器必须启动并初始化数据库,此时postgraphile可以连接并生成一个模式,这时我有一个graphql.schema文件...位于graphql容器内。但这一切都是在启动应用程序之后发生的-在此之前,作为脱机构建的一部分,我需要一个模式文件。
我对Docker,GraphQL,postgraphile尤其是Relay还是很满意的,所以我希望对这些技术更熟悉的人可以给我一些智慧。我还没有找到很多资源来专门使用带后石墨的Relay。
代替某些特定的最佳实践,也许更熟悉现代Web开发的人可以帮助我对这些选项进行排序:
我是否更新前端,使其完全能够旋转postgres服务器并运行postgraphile(仅作为dev依赖项),然后添加一个脱机脚本来生成schema.graphql文件供其自己使用?这似乎是一个大混乱。
我是否更新我的graphql容器,以便它总是写出一个模式文件,并根据需要手动将该文件复制并粘贴到我的前端中?
我是否在任何容器外部添加了一个额外的过程(可能会在更改数据库模式时手动运行)(通过备用docker-compose文件),从而旋转了我的应用程序堆栈的一部分,转储退出graphql模式,然后退出?如果是这样,是否有某种方法可以指导Docker容器在主机上写出文件,或者将本地目录装载到该容器是实现此目的的最佳方法?
是否有更好的结构化项目的方法,从而可以首先避免此问题?我是Docker的新手,我觉得也许我的大脑只是在Docker之前和之后的思维方式中分裂了。
您可以使用graphql-cli's get-schema
从启用了自省的端点下载模式文件。这样,您可以简单地从远程或本地PostGraphile端点获取模式。
尽管如此,同时运行本地版本的PostGraphile可以可靠地重新创建与生产模式相同的模式可能非常有益。