使用 NX Monorepo 从另一个库导入构建库

问题描述 投票:0回答:7

情况是这样的。我正在使用 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 下预计 包含所有源文件”

tsconfig monorepo nrwl nrwl-nx
7个回答
4
投票

尝试添加

"paths": { "@workspace/*": ["dist/libs/*"] }

进入您的 tsconfig.lib.json 文件。这应该可以解决问题。


2
投票

不要覆盖任何子 tsconfig 中的“baseUrl”和“paths”! 将所有“路径”放入 tsconfig.base.ts 中!


1
投票

尝试这个解决方案。不确定它是否是官方的,但就我而言,它运行良好。 需要解决3个问题:

  1. TypeScript 路径
  2. 编译的JS路径
  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

1
投票

尝试添加

lib-a
作为
lib-b
的隐式依赖项,将下面的行添加到
libs/lib-b/project.json
文件中,看看会发生什么:

"implicitDependencies": ["lib-a"]

运行

nx graph
应该会向您显示一个看起来像这样的图表(不要考虑库的名称):

之后您应该能够构建这两个库,我希望它也适合您。


0
投票

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


0
投票

您需要通过

'tags'
文件中的
project.json
字段指定每个项目的范围。这可以确保打字稿在导入过程中不会抱怨,并且您的问题得到解决。请注意以下代码。

对于

lib-a
项目,编辑
project.json
文件,如下所示:

{
  // ... more project configuration here
  "tags": ["scope:lib-a"]
}

您可以在 Nx 文档

中找到更多信息

0
投票

将 rootDir 添加到 project.json 选项对我有用

"targets": {
"build": {
  "executor": "@nx/js:tsc",
  "outputs": ["{options.outputPath}"],
  "options": {
    "rootDir": ".",
© www.soinside.com 2019 - 2024. All rights reserved.