【问题标题】:Monorepo pattern for two different angular applications?Monorepo 模式适用于两种不同的角度应用程序?
【发布时间】:2020-04-22 06:40:16
【问题描述】:

到目前为止,我们只有一个 Angular 8 应用程序。但是现在我们必须创建一个新的管理应用程序,其 UI 将与现有应用程序相似(类似于登录组件、侧边栏、导航栏等的相似 UI)。由于这两个应用程序将部署在两台不同的服务器上但彼此共享组件,因此我们决定将两个不同的源代码保存在一个具有共享组件库的 repo 下。

我们现有的应用程序是使用Jhipster 生成的。

我发现以下两种方法可能有助于维护两个不同的应用程序。

我在Creating Libraries for Angular 阅读了这篇文章。但是,我找不到任何有关如何更改现有构建过程以构建两个不同应用程序的材料?我阅读的所有文章都有 Angular CLI 命令来构建不同的应用程序。由于我们已经将 webpack 作为打包器,我如何配置它来构建我的两个应用程序?基本上,我所有的疑问都是关于如何扩展我们用来构建、测试和维护这两个不同应用程序的现有工具。

然后我阅读了有关 monorepo 模式的信息,并通过nrwl.io 遇到了Nx。据我了解,它是 Angular CLI 之上的一个包装器,以支持 monorepo 模式,并附带维护这两个应用程序所需的所有工具。

所以我的问题是,当您只需要在两个应用程序之间共享代码时,monorepo 模式是否值得采用?这是就开发的便利性与将现有应用程序转换为支持 monorepo 模式(设置工具,如Nx)所花费的时间而言,我读过这有点令人头疼。

【问题讨论】:

  • 请注意,JHipster 生成的 webpack 构建过程与 angular-cli 不完全兼容,所以我怀疑 Nx 是否可以工作。共享库对我来说看起来不错,您将有 3 个文件夹:lib、app1 和 app2。您的 lib builmd 进程应该部署到您的本地 npm 注册表(例如 Sonatype Nexus),并且 2 个应用程序应该在各自的 package.json 中引用它
  • 同意 JHipster webpack 构建过程与 angular-cli 不完全兼容。但是,通过将库发布到本地 npm 注册表的方法,我将有管理库版本和更新两个应用程序的开销。如 Nx 指南中所示,这种开销似乎由 monorepo 模式处理。

标签: angular typescript jhipster nrwl-nx


【解决方案1】:

免责声明,我是 NX 的忠实粉丝。

如何改变现有的构建过程来构建两个不同的应用程序?

不确定我是否可以验证下一个陈述,但在过去,我相信 Angular 文档是围绕单个应用程序编写的。最近(v7 或 8)文档词汇表已围绕Workspaces 进行了更新。可能是因为 NX 越来越受欢迎(他们从 Angular 6 之前就一直在开发 Angular 单体仓库)?

开箱即用的 Angular CLI

由于您使用的是 Angular 8,因此您可以像使用 Angular CLI 生成组件一样生成应用程序:ng generate application admin-app。此外,ng build 接受应用程序名称作为参数,因此您只需使用开箱即用的 Angular CLI 构建两个单独的应用程序即可。 ng build public-appng build admin-app

但是,如果您在预先存在的应用程序(也就是使用 ng new 生成的应用程序)中执行此操作,代码库可能会变得非常混乱,因为新应用程序将被放置在代码库内的 projects 目录中.你基本上会得到 App-Ception,我认为这是一个糟糕的主意。

official guidance around setting up a multi project workspace。您基本上创建了一个空工作区,所有生成的应用程序都放在项目目录中。

当您只需要在两个应用程序之间共享代码时,monorepo 模式是否值得一试?

这是主观的,两种方法(monorepo vs poly/microrepo)各有利弊,但在我看来,答案肯定是肯定的。但老实说,如果没有 NX,我什至不会尝试它。

NX

NX 带来了很多好处。说它是 Angular CLI 的包装器实际上只是表面问题。它确实有一系列示意图,可以扩展/改进现有的 Angular CLI 示意图(ng generate app|component|lib 等。是示意图)。它还可以轻松集成更好的开箱即用工具(Jest > Karma;Cypress > Protractor)。它还有自己的 CLI 工具,可以解决 monorepo 结构引入的许多问题(看看他们的guides

尝试将其合并到您现有的代码库中

根据他们的Getting Started Docs,您可以轻松地尝试一下:

ng add @nrwl/workspace

【讨论】:

  • 感谢您的意见。我确实选择了 Nx,主要是因为我相信我必须对 webpack 配置进行大量更改才能支持多个应用程序构建。不过,只有一个问题,Nx 将 tslint 作为默认 linter,我想将其更改为我已经配置的 eslint,我必须在 angular.json 文件的哪个位置进行更改才能集成它?
  • 抱歉回复缓慢。我对此进行了一些研究,根据 NX Github 上关于这个问题的 cmets,这将由 Angular CLI 团队(而不是 NX 团队)实现:github.com/nrwl/nx/issues/1912
猜你喜欢
  • 2018-05-12
  • 2017-06-13
  • 2021-01-16
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 2020-10-17
  • 1970-01-01
相关资源
最近更新 更多