13

我想使用 Nrwl Nx 开始一个 Angular 项目(一个项目中有多个应用程序;https: //nrwl.io/nx ),但我有两个问题:

  1. 如何为不同的应用程序指定不同的版本号?通常我会在 中给出一个版本号,但对于 Nx ,我的所有应用程序package.json只有一个版本号。package.json我应该把它放在环境文件中吗?还是在.angular-cli.json文件里?

  2. 我读到:“升级到库需要对所有实现者进行更改。” 是否有任何解决方案(绕过)在不同的应用程序中使用不同版本的 lib 或 NPM 包?只有一个node_modules,但这对我的应用程序至关重要。

如您所知,Nx 项目的结构如下所示:

apps
    app1
    app2
libs
    lib1
    lib2
node_modules
package.json
.angular-cli.json
...

也许这两个问题有点基于意见(我不太确定),但是关于 Nrwl Nx 的文章很少,答案也可以帮助其他人。谢谢你。

4

5 回答 5

4

我在这里有一些想法。我每天都在使用 NX Extensions,恕我直言,“这不是单声道回购方式”作为一种理想方式很好,但在实践中却失败了。您迟早会想要对库进行重大更改,并且您不希望应用程序中的所有测试在您执行此操作时都失败(阻止您发布等,您可能没有时间来清理)。这可能不是 OP 所要达到的,但我认为这些解决方案可能会有所帮助。我都试过了,他们似乎工作。

请注意,我知道谷歌的方式(我在那里工作)。我在我从事的第一个项目中遇到了这个问题。他们的开发环境提供了“如果您可以在每个应用程序中使用不同的 package.json...”的模拟,因此将 NX 与 Google 的内部系统进行绝对 1:1 的比较有点不对劲。

限定词:这不是“答案”。它只是分享了我克服这些问题的一些方法。

  • 分支整个 repo,称之为版本。做出重大改变,看到一切都崩溃了。修复一切,从 master 更新,看起来不错,合并它。可选:从此分支发布。

那个“devbranch”的东西适用于大多数“破坏lib change”的东西。

  • 在 tsconfig.json 中,如果您为您的库 (@myorg/blah) 起别名,您的应用程序将指向您配置的路径。在 master 中,构建你的库(ng-packagr)。使用输出配置,您可以随意调用 dist(@myorg/blah-v1、v2、任意数量)。将 tsconfig 指向它(tsconfig 将指向非构建路径)。Master 现在将使用一个锁定的、已知的 lib 版本(只是不要通过更改重新构建它)。您现在可以随意滥用您的主库。为了保持“一切都在 master 工作”的心态,您将分支 master,然后进行此更改,这将允许您在 lib 上独立于使用它的应用程序而 master 保持不变。

  • 构建你的库(版本化,并假定 ng-packagr),npm 打包它(你现在有一个 tarball),用它做你想做的事。分支大师,从 tsconfig 中删除路径条目,将安装条目添加到 package.json(您可以从文件安装),您的应用程序应该选择它(同样,导入别名应该匹配)。您还可以在 master 中进行安装(已知的工作版本为 tarball),然后根据需要再次滥用您的库。

后一种解决方案我测试了一点,我发现它有效,但如果你不必打包一个 tarball 并弄乱 package.json,为什么还要麻烦。不过,这是一个很好的选择,它不会导致无法重建库的缺点(因为除非您更改输出目标,否则您将覆盖已知的工作版本)。

使用这些想法,我几乎可以让我们摆脱任何重大变更的困境,并至少提供任何给定库的另一个已知工作版本。

不过,我也会把这些放在那里:

单一回购的主要好处是它迫使您避免招致多个 lib 版本导致的技术债务,如果您放弃它在任何时间段内,这将是严重的。如果你放得够久,迟早你会遇到 Angular 的整体版本的问题,这是你想要避免的问题。

如果你有一个需要大量漂移的应用程序,恕我直言,你最好通过创建一个新的存储库,将代码转储到其中,从你的主存储库中擦除它,等到它进入形状,准备好后放回去(如果有的话)。

而且,请记住,当你在图书馆工作时,你需要有一些不同的想法。它是共享代码,每次您对其进行更改时,它都不会被破坏。与其重命名该输入,不如创建另一个输入并将其指向原始输入(向后兼容),诸如此类。装饰器模式,所有这些。库中的重大更改不应该是随便提交的事情。

希望有帮助。

于 2020-08-24T18:24:12.510 回答
4

从技术上讲,不可能为 NX 工作空间中的不同应用程序指定不同的版本号,因为 NX 工作空间是基于 monorepo(它是领先的 IT 公司使用的技术,如 google、Facebook 等)。

是的,您可以通过重组 NX 工作区为不同的应用程序指定不同的版本号,但从技术上讲,它不会是 monorepo NX 工作区。

于 2019-02-25T12:15:22.080 回答
1

正如 JBecton 已经回答的那样,“Nx 方式”是拥有一个 package.json。

在您的情况下,您需要将您的应用程序版本控制与 mono-repo 版本控制分离。

角度生成的 environment*.ts 文件是执行此操作的正确位置。

于 2018-06-28T09:42:05.243 回答
-1

根据 Monorepo 的概念,所有应用程序都应该放在同一个保护伞中,这意味着在同一个存储库中,并且要在同一个 monorepo 中维护多个应用程序,使用不同的版本是非常困难的。还拥有一个包文件确保在更新工作区时所有应用程序都默认更新。这应该是任何组织在同一版本中拥有所有应用程序的标准。

于 2019-09-14T07:10:25.323 回答
-1

Nx 使用 MonoRepo 方法,因此您的应用程序和库都将是相同的版本。https://nrwl.io/nx/why-a-workspace

于 2018-04-17T18:57:34.807 回答