情况是这样的。我正在使用 Nrwl NX Monorepo。我有 2 个库:
lib-a
和 lib-b
;两者都是通过 NX 创建的可发布库。
现在我在
MyClass.ts
中创建一个 lib-a
。当然,在 workspace/tsconfig.json
> paths
中的路径下,NX 会为此 lib-a
("@workspace/lib-a": ["libs/lib-a/src/index.ts"]
) 创建一个别名。
到目前为止一切顺利。现在我们可以通过
import { MyClass } from '@workspace/lib-a';
导入该类,在工作区/monorepo 中的任何位置使用该类
不幸的是,我们无法构建正在导入
lib-b
的 MyClass
。当我们尝试这样做时,我们会收到以下错误。所以问题是我们如何构建lib-b
?
PS:奇怪的是,NX monorepo 实际上不支持链接 2 个可发布库的常见场景。
“错误 TS6059:文件“d:/workspace/libs/lib-a/src/index.ts”不是 在 'rootDir' "d:\workspace\libs\lib-b\src" rootDir 下预计 包含所有源文件”
尝试添加
"paths": { "@workspace/*": ["dist/libs/*"] }
进入您的 tsconfig.lib.json 文件。这应该可以解决问题。
不要覆盖任何子 tsconfig 中的“baseUrl”和“paths”! 将所有“路径”放入 tsconfig.base.ts 中!
尝试这个解决方案。不确定它是否是官方的,但就我而言,它运行良好。 需要解决3个问题:
首先。 TypeScript 路径通过将“路径”添加到workspace/tsconfig.lib.json 中来解析。 NX 在 lib gen 时自动执行此操作。看看 Radovan Skendzic 的回答。
第二。已编译的 JS 路径的问题在这里得到了很好的描述:Typescript 路径在 Express 项目中不起作用。因此,您需要将 tsconfig-paths 安装到您的工作空间中:
yarn add -D tsconfig-paths
第三。考虑到 nx run [project]:[target] 正在工作区/目录中工作,您应该将 CWD 设置为 libs/lib-b 主目录 - 以找到正确的 tsconfig.json
所以,最后,您有以下应该可以工作的执行器(将其添加到您的 lib-b/project.json 中):
"targets": {
"start-dev": {
"executor": "@nrwl/workspace:run-commands",
"options": {
"commands": [
"nodemon -e ts,js --exec ts-node -r tsconfig-paths/register src/index.ts"
],
"cwd": "libs/lib-b"
}
},
...
}
运行命令:
nx run lib-b:start-dev
nx 在 tsconfig.base.json 中设置路径,以便您可以从 monorepo 中的库导入,而无需任何进一步的设置。
如果您的 monorepo 名为 my-monorepo 并且您要从中导入的库名为 my-other-lib 那么您应该能够执行以下操作:
import { foo } from '@my-monorepo/my-other-lib';
请参阅文档以获取完整信息:https://nx.dev/concepts/more-concepts/applications-and-libraries
您需要通过
'tags'
文件中的 project.json
字段指定每个项目的范围。这可以确保打字稿在导入过程中不会抱怨,并且您的问题得到解决。请注意以下代码。
对于
lib-a
项目,编辑 project.json
文件,如下所示:
{
// ... more project configuration here
"tags": ["scope:lib-a"]
}
您可以在 Nx 文档
中找到更多信息将 rootDir 添加到 project.json 选项对我有用
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": ["{options.outputPath}"],
"options": {
"rootDir": ".",