我找到的所有在 Angular 中开发库的示例始终将库与应用程序放在同一工作区中,但我不能这样做。
我有三个不同的 Angular 18 工作区,一个用于库 A,一个用于使用库 A 的库 B,另一个用于通过 npm 链接使用这两个库的应用程序。
这是一般结构:
ws2
└── src/
└── app/
└── component.ts
ws2
└── projects/
└── libraryA/
└── featureA1/
├── ...
├── index.ts
├── ng-package.json
└── public-api.ts
└── featureA2/
├── ...
├── index.ts
├── ng-package.json
└── public-api.ts
ws3
└── projects/
└── libraryB/
└── featureB1/
├── ...
├── index.ts
├── ng-package.json
└── public-api.ts
我一直在关注“构建具有多个入口点的 Angular 库”。
图书馆只有辅助入口点。一些入口点导入其他入口点。
因此,对于libraryA中的featureA1要使用libraryA中的featureA2,导入如下所示:
import { ... } from 'libraryA/featureA2';
在 tsconfig.json 中的libraryA路径中我已经包含了
"paths": {
"libraryA": ["./projects/libraryA"],
"libraryA/*": ["./projects/libraryA/*"],
}
libraryB 通过 npm 链接使用libraryA,libraryB 中组件的导入如下所示:
import { ... } from 'libraryA/featureA1';
构建库B时,编译器会出现错误:
error TS2307: Cannot find module 'libraryA/featureA1' or its corresponding type declarations.
指向libraryA的dist文件夹中的文件(“../libraryA/dist/libraryA/featureA1/...”),其中包含
import { ... } from 'libraryA/featureA1';
我尝试在libraryB的tsconfig.json中包含另一个路径映射,以便为编译器提供提示在哪里可以找到“libraryA”
"paths": {
"libraryB": ["./projects/libraryB"],
"libraryB/*": ["./projects/libraryB/*"],
"libraryA": ["./node_modules/libraryA"],
"libraryA/*": ["./node_modules/libraryA/*"],
}
然后libraryB 构建得很好,但随后必须在应用程序的tsconfig.json 中包含libraryA 和libraryB(指向node_modules)的类型映射。然后应用程序会构建,但 Angular 在 ng serve
上抛出错误
NG0203。
如何在同一库中的另一个辅助入口点中引用辅助入口点,然后通过 npm 链接在另一个工作区的项目中使用该库?
确保在 angular.json 中为所有使用链接的项目设置了
"preserveSymlinks": true
。
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
...
"preserveSymlinks": true,
本教程非常适合使用链接包。
我认为指向 dist 文件夹会导致
NG0203
,这基本上意味着,您拥有的服务不被视为角度服务,而是 javascript 类。