Nrwl Nx:不同的版本号和库

时间:2018-03-06 13:21:40

标签: angular angular-cli nrwl

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:2)

从技术上讲,无法为NX工作区中的不同应用程序指定不同的版本号,因为NX工作区基于monorepo(谷歌,Facebook等领先的IT公司使用的技术)。

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

答案 1 :(得分:1)

按照Monorepo的概念,所有应用程序都应放在同一伞下,这意味着在同一存储库中,并且要在同一monorepo中维护多个应用程序,使用不同版本非常困难。 还具有一个软件包文件,以确保在更新工作空间时,默认情况下所有应用程序都在更新。 任何组织将所有应用程序都具有相同版本的标准应该是什么。

答案 2 :(得分:1)

我在这里有一些想法。我每天都与NX Extensions一起工作,恕我直言,依靠“那不是mono repo方法”可以很好地实现,但实际上却失败了。您迟早会想要对lib进行重大更改,并且您不希望应用中的所有测试在执行时都会失败(防止发布等),您可能没有足够的时间来进行测试。清理)。这可能不完全是OP所要解决的问题,但我认为对这些解决方案可能有用的情况稍作更改。我已经尝试了所有方法,它们似乎都起作用。

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

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

  • 分支整个仓库,将其称为版本。进行重大更改,看看一切都崩溃了。修复所有问题,从master更新,看起来不错,将其合并。可选:从该分支发布。

“ devbranch”一词适用于大多数“破坏lib更改”之类的东西。

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

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

我测试了后一种解决方案,我发现它可以工作,但是如果您不必打包压缩包并与package.json混为一谈,何必麻烦您。不过,这是个不错的选择,并且不会造成无法重建库的不利影响(因为除非更改输出目标,否则您将覆盖已知的工作版本)。

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

我也会把它们放在那儿

mono回购的主要好处是,它迫使您避免产生多个lib版本导致的技术债务,如果您任其放任一段时间,那就很严重。如果您将其放置足够长的时间,则迟早会遇到整个Angular版本的问题,这是您要避免的问题。

恕我直言,如果您的应用程序需要进行大量调整,最好创建一个新的存储库,将代码转储到其中,从主存储库中删除它,直到它会成型,然后在准备就绪时放回去(如果有的话)。

记住,当您在图书馆工作时,您需要有所不同。它是共享代码,每次您对其进行更改时,都不会中断。无需重命名该输入,而是创建另一个输入并将其指向原始输入(向后兼容)以及类似的东西。装饰器模式,所有这些。 lib中的重大更改不应该是随随便便的事情。

希望有帮助。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

JBecton已经回答,“ Nx方法”是拥有一个package.json。

在这种情况下,您需要将应用程序版本控制与单仓库版本控制解除关联。

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