首页 > 解决方案 > Angular Libraries Monorepo:是否可以为每个库使用不同的版本?

问题描述

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

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

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

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

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

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

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

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

标签: angularangular-climonorepo

解决方案


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

使用 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。您需要为这些版本构建该库的两个分支。

我正在尝试构建一个应该能够使用 angular-cli v8 的 monorepo,但仍然能够编译和构建为 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 兼容(例如,路由器最近改变了惰性模块的加载方式)。

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


推荐阅读