具有本地 npm link 的多存储库 graphql 类型
multi-repository graphql types with local npm link
给定 2 个存储库 user-repo
和 project-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 GraphQLObjectType
returns假。而且只有 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 禁止符号链接。要解决这个问题,您可以复制应用程序临时目录中的公共代码,然后构建容器并删除临时目录。
给定 2 个存储库 user-repo
和 project-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 GraphQLObjectType
returns假。而且只有 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 禁止符号链接。要解决这个问题,您可以复制应用程序临时目录中的公共代码,然后构建容器并删除临时目录。