Angular 库 Monorepo:是否可以为每个库使用不同的版本?

Mic*_*sco 3 angular-cli monorepo angular

只是一个我似乎找不到答案的简单问题。

我正在尝试构建一个 monorepo,它应该能够使用 angular-cli v8,但仍然能够编译和构建为 v2、v3、v4 等制作的库(主要是组件和服务)。

版本之间有很多变化,让我们举个例子:

V5 之前的 Angular 使用@angular/http.

我们当前的版本(8)使用 @angular/common/http

我已经尝试在库的 package.json 中应用特定版本,但它似乎无论如何都不起作用,并且在构建期间(甚至在 IDE 中),它告诉我它无法找到@angular/http,因为它已被弃用从 Angular V5.

有什么可能的方法可以为我们提供我们需要的功能吗?

选择这样的 monorepo 不是我的选择,所以请避免评论“多么糟糕的模式!”..我只想知道是否有机会让它按照我期望的方式工作。

Rea*_*lar 6

可悲的是,答案是否定的。

使用 Angular 源代码时,您与特定版本的 Angular 紧密耦合。因此,GitHub 上的大多数项目在 Git 中为每个 Angular 版本维护单独的工作分支。

然后,您必须通过本地的 NPM 安装 Angular 的编译链node_modules并执行构建,npm build以便使用正确版本的 Angular 来编译该代码,因为您的 Angular CLI 全局安装可能会跟踪最新的稳定版本。这意味着 Angular CLI for 8 不能用于为 Angular 6 构建项目。

以上主要适用于 Angular 库。因此,如果您为 Angular 7 构建一个组件库,并且还希望支持 Angular 8。您需要为这些版本构建的该库的两个分支。

我正在尝试构建一个 monorepo,它应该能够使用 angular-cli v8,但仍然能够编译和构建为 v2、v3、v4 等制作的库(主要是组件和服务)。

这并不重要。您不能在 Angular v8 应用程序中使用 Angular v2 库。Angular 是这里的对等依赖项。所以组件库不会捆绑自己对框架库的依赖。相反,它们被编译为加入拥有应用程序使用的对等依赖项。这意味着,您的所有库都必须使用将由将使用的应用程序编译的相同 Angular 版本进行编译。

NPM 将安装因次要版本而异的依赖包。因此,Angular 8.0.0 库将与 Angular 8.9.9 应用程序一起安装,但从技术上讲,如果该库适用于该版本,那只是幸运。在测试之前您不知道,但 NPM 不会为使用 9.0.0 的项目的 8.0.0 对等安装库。实现这一点的唯一方法是更改​​组件库定义的对等依赖项,但幸运的是将其与应用程序一起编译并查看它是否有效。Angular 长期以来一直不与以前的版本完全兼容 API(例如,路由器最近更改了惰性模块的加载方式)。

我希望这回答了你的问题。我在这里可能有点跑题了。