Yarn link:将 graphql-js 项目导入另一个 graphql-js 项目显示另一个模块或领域错误
Yarn link: Importing graphql-js project into another graphql-js project showing another module or realm error
我使用 graphql-js 而不是 SDL 来设计我的 graphql 服务器。为此,我创建了一个依赖于 graphql-js 的小型库。
因此,我正在 link 使用 yarn (yarn add link:../lib) 将此库添加到我的主要项目中以构建 graphql 对象和模式。
我的 package.json 文件如下
graphql-lib/package.json
{
"name": "graphql-lib",
"private": true,
"version": "0.1.0",
"description": "",
"main": "index.ts",
"dependencies": {
"graphql-iso-date": "^3.6.1"
},
"devDependencies": {
"@types/graphql-iso-date": "^3.4.0",
"@types/jest": "^25.2.3",
"@types/node": "^14.0.5",
"jest": "^26.0.1",
"ts-jest": "^26.1.0",
"typescript": "^3.9.3"
},
"peerDependencies": {
"graphql": "^15.1.0"
}
}
core/package.json
{
"name": "@core/schema",
"private": true,
"version": "0.1.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"graphql-lib": "link:../lib",
"graphql": "^15.1.0",
"graphql-iso-date": "^3.6.1"
},
"devDependencies": {
"@types/graphql-iso-date": "^3.4.0",
"@types/jest": "^26.0.0"
}
}
使用 ts-jest 的 graphql-lib 测试工作正常。
但是,当我测试我的主要项目时,出现以下错误 -
Cannot use GraphQLScalarType "Float" 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.
node_modules 目录中的 graphql 模块仅包含 graphql-js 版本 15.1.0。我已经删除并重新安装了两个软件包中的 node_modules。
我的理解是应该有单一的graphql执行实例。我是否遗漏了在两个项目中都创建了 graphql 实例的东西?我可以 link 我的项目使用 yarn 并维护单个 graphql 实例吗?
只有当您的依赖项中有多个 graphql-js
副本时才会出现该错误。最常见的原因是您的 node_modules
中有多个版本。您可以通过 运行ning npm ls graphql
或 yarn ls graphql
验证情况是否如此——如果您看到依赖项中列出了多个版本,那就是一个问题。通常,这仅在您具有直接依赖于 graphql-js
的依赖项(而不是使其成为对等依赖项)时才会发生。如果你使用 yarn,你可以使用它 selective dependency feature 来解决这个问题。
当您在本地开发多个包时,您也可以 运行 解决这个问题,因为您有两个不同的副本 graphql-js
-- 在您的两个项目中各有一个。发生这种情况是因为 npm link
或 yarn add link
仅创建一个从您项目的 node_modules 到另一个项目的符号 link。作为解决方法,您也可以 link graphql-js
。进入项目 A 内的 node_modules/graphql
和 运行 npm link
/yarn link
。然后进入项目B的根目录和运行 npm link graphql
/yarn link graphql
。现在项目 B 将使用项目 A 的库副本而不是它自己的。
我使用 graphql-js 而不是 SDL 来设计我的 graphql 服务器。为此,我创建了一个依赖于 graphql-js 的小型库。
因此,我正在 link 使用 yarn (yarn add link:../lib) 将此库添加到我的主要项目中以构建 graphql 对象和模式。
我的 package.json 文件如下
graphql-lib/package.json
{
"name": "graphql-lib",
"private": true,
"version": "0.1.0",
"description": "",
"main": "index.ts",
"dependencies": {
"graphql-iso-date": "^3.6.1"
},
"devDependencies": {
"@types/graphql-iso-date": "^3.4.0",
"@types/jest": "^25.2.3",
"@types/node": "^14.0.5",
"jest": "^26.0.1",
"ts-jest": "^26.1.0",
"typescript": "^3.9.3"
},
"peerDependencies": {
"graphql": "^15.1.0"
}
}
core/package.json
{
"name": "@core/schema",
"private": true,
"version": "0.1.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"graphql-lib": "link:../lib",
"graphql": "^15.1.0",
"graphql-iso-date": "^3.6.1"
},
"devDependencies": {
"@types/graphql-iso-date": "^3.4.0",
"@types/jest": "^26.0.0"
}
}
使用 ts-jest 的 graphql-lib 测试工作正常。
但是,当我测试我的主要项目时,出现以下错误 -
Cannot use GraphQLScalarType "Float" 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.
node_modules 目录中的 graphql 模块仅包含 graphql-js 版本 15.1.0。我已经删除并重新安装了两个软件包中的 node_modules。
我的理解是应该有单一的graphql执行实例。我是否遗漏了在两个项目中都创建了 graphql 实例的东西?我可以 link 我的项目使用 yarn 并维护单个 graphql 实例吗?
只有当您的依赖项中有多个 graphql-js
副本时才会出现该错误。最常见的原因是您的 node_modules
中有多个版本。您可以通过 运行ning npm ls graphql
或 yarn ls graphql
验证情况是否如此——如果您看到依赖项中列出了多个版本,那就是一个问题。通常,这仅在您具有直接依赖于 graphql-js
的依赖项(而不是使其成为对等依赖项)时才会发生。如果你使用 yarn,你可以使用它 selective dependency feature 来解决这个问题。
当您在本地开发多个包时,您也可以 运行 解决这个问题,因为您有两个不同的副本 graphql-js
-- 在您的两个项目中各有一个。发生这种情况是因为 npm link
或 yarn add link
仅创建一个从您项目的 node_modules 到另一个项目的符号 link。作为解决方法,您也可以 link graphql-js
。进入项目 A 内的 node_modules/graphql
和 运行 npm link
/yarn link
。然后进入项目B的根目录和运行 npm link graphql
/yarn link graphql
。现在项目 B 将使用项目 A 的库副本而不是它自己的。