我在这里有一些想法。我每天都在使用 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 的整体版本的问题,这是你想要避免的问题。
如果你有一个需要大量漂移的应用程序,恕我直言,你最好通过创建一个新的存储库,将代码转储到其中,从你的主存储库中擦除它,等到它进入形状,准备好后放回去(如果有的话)。
而且,请记住,当你在图书馆工作时,你需要有一些不同的想法。它是共享代码,每次您对其进行更改时,它都不会被破坏。与其重命名该输入,不如创建另一个输入并将其指向原始输入(向后兼容),诸如此类。装饰器模式,所有这些。库中的重大更改不应该是随便提交的事情。
希望有帮助。