具有本地 npm link 的多存储库 graphql 类型

multi-repository graphql types with local npm link

给定 2 个存储库 user-repoproject-repo,我在 user-repo 中定义 UserType,在 project-repo 的 package.json 中定义这个:

"dependencies": {
    "user-repo": "git+ssh://git@github.com/me/user-repo"
}

一切正常(UserType 加载到 project-repo)。 但是,如果我 link 像这样本地回购:

"dependencies": {
    "user-repo": "file:../../user-repo"
}

UserType instanceof GraphQLObjectTypereturns。而且只有 graphql 类型在起作用。模型等其他所有内容都可以正常加载。

我已经尝试过 npm linking (npm link user-repo),同时使用 require 和 import 方法,但没有用。 有什么想法吗?

好的,我开始了,我不完全确定,但我敢打赌 instanceof 有点棘手,我正在想象以下场景:

您在 user-repo 中构建您的架构,并 运行 在 project-repo 中进行检查。这两个 repos 都安装了自己的 graphql 模块依赖项,这意味着 user-repo 中的 GraphQLObjectType 构造函数不同于 project-repo 中的构造函数,这就是为什么 instanceof returns 错误的。您可以通过 UserType.contructor.name === 'GraphQLObjectType' 确认它确实没问题,这应该是真的。

一个解决方案是从同一模块导入 GraphQLObject。看看是否可行。

像以前一样编辑这个答案我已经提供了一个带有 webpack 别名的解决方案,但这不适用于后端。

graphql-js 问题跟踪器中也讨论了这个问题:

https://github.com/graphql/graphql-js/issues/1091#issuecomment-349874772

FB 开发者@leebyron 的回答:

Unfortunately npm link is pretty broken, though I'm surprised using a file path as a dependency didn't work for you.

This issue occurs when there are multiple instances of graphql-js in your node_modules directory. npm-link works by creating symlink to another directory, if that other directory also has a node_modules folder with graphql-js within it, then you'll have multiple copies.

When I develop in this way, I usually set up a script which cp's my sub-project's built source directly into the main project's node_modules directory, avoiding any filesystem symlinking hyjinx.

我们最终这样做了:公共代码不再是 npm 包,我们使用符号链接映射每个应用程序目录中的公共代码目录,import/require 与任何应用程序模块相同。

给那些使用 docker 的人的提示:你将无法以这种方式将公共代码放入容器中,docker 禁止符号链接。要解决这个问题,您可以复制应用程序临时目录中的公共代码,然后构建容器并删除临时目录。