【问题标题】:Lerna. Install dependencies to root project勒纳。将依赖项安装到根项目
【发布时间】:2018-12-12 08:56:19
【问题描述】:

我有这样的标准Lerna 存储库:

my-repo
 - package.json
 - packages
   - api
     - package.json
   - web-app 
     - package.json

如果我在两个包中需要相同的依赖项(例如lodash),那么教程中的人建议将其安装到两个子模块,然后使用lerna bootstrap --hoist 标志引导项目。

由于 --hoist 标志 lodash 依赖项将仅加载到根级别 node_modules 但两个子模块都将其作为依赖项包含在其适当的 package.json

但 Node 的包解析算法会在文件树上搜索node_modules 文件夹。

所以我的问题是为什么我不能只将公共依赖项安装到根级项目?然后lodash 将位于根的node_modules 下。并且子模块(包)会找到它,因为 Node 会搜索node_module,直到到达文件系统的根目录。

至少它会帮助我避免使用不常见的lerna bootstrap --hoist,以及lodash 依赖项只会在顶级package.json 出现一次(而不是两次:在两个子模块的package.json 中)

【问题讨论】:

标签: node.js lerna monorepo


【解决方案1】:

所以我的问题是为什么我不能只将常见的依赖项安装到 root 级项目?

你可以,而且你是对的,节点的解析算法会很好地找到共享依赖项。 这样做的缺点是您失去了灵活性,并且您需要部署或使用整个单一存储库,这可能对您来说很好。一种更传统的方法是将生产依赖项保留在子包中,以便您可以发布包并单独使用它们,而不依赖于 monorepo 的根目录,但这对您来说可能并不重要。

【讨论】:

  • 您说“您需要部署或使用整个单一存储库”,但我认为推荐的方法(请参阅github.com/lerna/lerna/blob/master/doc/hoist.md"Forgotten Dependencies")是还要在需要它的包中包含提升的依赖项,以及 monorepo 根。事实上,他们似乎建议 linting 强制执行。然后,从 monorepo 运行每个包都会获得完全相同的 dep,但这些包也可以独立工作。
  • @user568458 对我来说听起来效率很低,包括叶子发布的 NPM tarball 中不需要的 deps。
【解决方案2】:

如果你的包是你打算通过发布到一些 npm 注册表来重用的 npm 包,那么你应该给它们适当的 package.json 依赖项。

一个包应该总是列出它需要什么来操作。例如。如果您的“api”包在运行时需要 lodash,那么它的依赖项中必须有 lodash。否则应用程序可以在没有 lodash 的情况下安装它;那么它将无法运行。

在您的 lerna 存储库中,您的“根”package.json 没有连接到任何 npm 包,也没有发布,因此它不会影响您的“真实”npm 包:“api”和“web-app” .

最后,如果你不打算将你的包发布为 npm 包,那么你可以做任何你想做的事情。在这种情况下,Lerna 可能是矫枉过正。甚至 package.json 也太过分了,因为它只是被用于它的scripts

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2016-08-21
    • 2023-04-07
    • 2016-08-21
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多