【发布时间】:2021-09-16 14:35:23
【问题描述】:
我创建了 3 个 Angular 库/包:
-
@example/ng-youtube-player包含YoutubePlayerComponent和YoutubeApiService -
@example/ng-dailymotion-player包含DailymotionPlayerComponent和DailymotionApiService -
@example/ng-vimeo-player包含VimeoPlayerComponent和VimeoApiService
现在我想创建一个包含VideoPlayerComponent 的库,只使用提供YoutubeApiService、DailymotionApiService 和VimeoApiService 的包。为了不包含不必要的其他组件,我想分别拆分 3 个库,这样我就可以只安装 Service 类。
您可能会争辩说 Angular 使用了 tree-shaking,所以组件 无论如何都不会与应用程序捆绑在一起,但无论如何我宁愿 为简洁起见,将这些依赖项分开。
我尝试设置一个包含 2 个库和一个测试应用程序的 monorepo,但是从我从另一个库引用服务的那一刻起,构建失败。我创建了一个非常基本的示例工作区来重现该问题:
git clone https://github.com/PieterjanDeClippel/angular-monorepo-test
cd angular-monorepo-test
npm install
ng build @mintplayer/ng-youtube-api
ng build @mintplayer/ng-youtube-player
ng build ng-youtube-player-demo
# All projects compile successfully
# Now go to the NgYoutubePlayerComponent and uncomment the injection parameter in the constructor (line 16)
ng build @mintplayer/ng-youtube-player
构建失败并出现大量以下错误:
✖ Compiling with Angular sources in Ivy partial compilation mode.
projects/mintplayer/ng-youtube-api/src/lib/ng-youtube-api.service.ts:1:1 - error TS6059: File 'C:/Users/user/source/repos/Tmp/mintplayer-ng-youtube-player/projects/mintplayer/ng-youtube-api/src/lib/ng-youtube-api.service.ngtypecheck.ts' is not under 'rootDir' 'C:\Users\user\source\repos\Tmp\mintplayer-ng-youtube-player\projects\mintplayer\ng-youtube-player\src'. 'rootDir' is expected to contain all source files.
1 import { Injectable } from '@angular/core';
projects/mintplayer/ng-youtube-api/src/public-api.ts:1:1 - error TS6059: File 'C:/Users/user/source/repos/Tmp/mintplayer-ng-youtube-player/projects/mintplayer/ng-youtube-api/src/public-api.ngtypecheck.ts' is not under 'rootDir' 'C:\Users\user\source\repos\Tmp\mintplayer-ng-youtube-player\projects\mintplayer\ng-youtube-player\src'. 'rootDir' is expected to contain all source files.
这里有两个主要问题:
- 您必须按照正确的顺序分别构建每个项目
- 您不能使用其他图书馆的图书馆服务
我已经阅读了以下类似的问题,但对我没有帮助:
代码
我的测试代码托管在here。重现该问题的所有说明都在上面的代码块中注明。我所做的主要更改在根tsconfig.json:
{
...
"compilerOptions": {
...,
"paths": {
"@mintplayer/ng-youtube-api": [
"projects/mintplayer/ng-youtube-api/src/public-api.ts"
],
"@mintplayer/ng-youtube-player": [
"projects/mintplayer/ng-youtube-player/src/public-api.ts"
]
}
}
}
我已经设置了一个包含库和应用程序的工作区,其中应用程序使用库中的类没有任何问题(请参阅问题顶部的 3 个存储库),但是从库使用另一个库中的类的那一刻起,构建被破坏。
我该如何解决这个问题,并拥有一个包含 2 个库和一个测试应用程序的工作区?
【问题讨论】:
-
我想我会需要这个:github.com/nrwl/nx-examples
标签: angular typescript monorepo angular-library