1

我正在开发一个反应应用程序,并为 graphql 使用 apollo 和 postgraphile。我目前必须打开两个终端窗口,一个正在运行

npm start 

对于 react-dev 服务器,一个正在运行

postgraphile -c 'postgresstring'

对于 postgraphile 服务器

这样做时一切正常,但我正在将项目交给我的团队的其他成员,并希望他们能够简单地运行

npm start

启动 react 和 postgraphile 服务器。我尝试同时使用 npm 包和 npm-start-all 在 npm start 上运行这两个脚本,但是每次我使用 npm 运行 postgraphile 命令时,我都会在尝试在 graphiql 中实际查询 graphql 服务器时遇到错误,说我有重复graphql 运行的实例。即使我将 postgraphile 命令放在它自己的 npm 命令中,也会发生这种情况

"graphql": "postgraphile -c 'postgresstring'"

并运行

npm run graphql

错误信息:

Error: Cannot use GraphQLSchema "[object Object]" from another module or realm.

Ensure that there is only one instance of "graphql" in the node_modules
directory. If different versions of "graphql" are the dependencies of 
other relied on modules, use "resolutions" to ensure only one version 
is installed.

https://yarnpkg.com/en/docs/selective-version-resolutions

Duplicate "graphql" modules cannot be used at the same time since different
versions may have different capabilities and behavior. The data from one
version used in the function from another could produce confusing and
spurious results.

如何通过 npm run 运行 postgraphile 以便我可以同时使用或 npm-run-all 使用单个命令运行它们?请注意,仅使用“node scripts/start.js && postgraphile -c 'postgresstring'”是行不通的,因为它会等待 start.js 服务器在运行 postgraphile 之前终止。

4

1 回答 1

2

graphql对于在 Node.js 生态系统中工作的人来说,这是一个常见的痛苦。解决这个问题的方法是在你的yarn 中添加一个"resolutions"条目,它应该尝试安装一个版本,只要该版本满足支持的 GraphQL 范围,而不是安装多个版本。为此,请在您的文件中添加如下内容:package.jsongraphql@0.12.xpackage.json

"resolutions": {
  "graphql": "0.12.x"
}

然后yarn再次运行,您应该注意到您的yarn.lock文件已更新为仅引用一个版本的graphql.


解释

postgraphile您运行的第一个命令执行全局安装的postgraphile命令(通过npm install -g postgraphileor安装yarn global add postgraphile);它不会遇到这个问题,因为它只有自己的依赖项并且它们不冲突。

但是对于该npm run命令,npm 会自动将您的本地./node_modules/.bin/文件夹添加到开头,$PATH因此您的本地副本postgraphile(通过 安装yarn add postgraphile)正在被执行。(这是您想要的行为!)看来您还安装了其他依赖于graphql(也许是 Apollo 客户端?)的东西,现在graphql您的node_modules文件夹中有两个版本,每个版本位于不同的位置,并且postgraphile正在选择不同的版本为graphile-build,这导致了问题。

快乐的 PostGraphing!

于 2018-08-23T16:44:35.867 回答