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

Angular Libraries Monorepo: Is it possible to use different versions for every library?

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

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

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

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

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

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

以来已被弃用

是否有任何可能的方式为我们提供我们需要的功能?

我不是选择这样的单一代码库,所以请避免评论 "what a bad pattern!"..我只是想知道是否有机会让它按照我期望的方式工作.

遗憾的是,答案是否定的

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

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

构建项目

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

I'm trying to build a monorepo which should be able to use angular-cli v8, but still being able to compile and build libraries (mainly components and services) made for v2, v3, v4, etc..

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

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

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

@Reactgular 就此不可能而言是正确的。然而,其余的并不完全正确。我建议您使用 Angular 7 构建您的库。这样它通常与 Angular 6-8 兼容。如果您不使用 rxjs — 那么它甚至可以与 Angular 4-5 一起使用(Angular 6 移动到 rxjs 6 并且有重大更改)。 API 没有太多变化,所以这真的取决于你从框架中使用什么。