Yarn workspaces & monorepo & monobuild,以及如何只构建更改的内容和依赖关系?



在monorepos/monobuilds中完成了一些事情(您可以在没有monobuild的情况下做monorepo),这使得事情非常好,但我还没有看到yarn工作区如何解决它。其中一个主要的是我不明白纱线工作区如何在单构建过程中完成这一部分(非常典型的规模)

  1. git status查看哪些文件被修改
  2. 将这些文件映射到已更改的项目
  3. 构建这些项目和依赖于这些项目的项目以及依赖于这些项目的项目

我有点糊涂了。当一个单构建扩展时,我们真的希望一个服务器更改的构建时间在3分钟以内,而对一个可能影响所有项目的库的更改将花费很长时间,因为它会构建整个repo(除非我们将其拆分到不同的机器上,构建时间再次下降)。

不要认为这里一定有一个答案,而是在你的项目背景下考虑一些事情:

  • 如果你的项目真的非常大,可以考虑像Bazel这样的东西,它有点复杂,但允许增量构建和测试。
  • 有一些特定的工具可以帮助快速构建大型项目。例如,对于JavaScript,有Turborepo和Nx。
  • Yarn工作区或npm工作区通常可以通过允许我们仅为工作区的子集运行构建脚本来帮助实现更好的单线程构建过程。它们不会解决问题,尽管弄清楚何时构建什么,它们只是为我们提供了有选择地运行脚本的基本构建块。最后,可能需要一点Bash/Git/Makefile魔法。例如,下面的git命令可以帮助我们确定自上次提交git diff --quiet HEAD~1 HEAD -- [paths]以来特定路径中的文件是否发生了更改。请注意,虽然这可能会产生一些恼人的边缘情况,特别是如果构建失败,我们可能会错过我们应该构建的项目。
  • 一些CI/CD平台上有一些插件,它们以一种更容易使用的方式包装Git命令。例如,我使用了GitHub的动作已经改变了路径,我认为有一个插件BuildKite也,但我找不到链接到那个。

一般来说,我认为拥有一个避免为所有模块/工作区安装依赖并编译所有代码的单线程设置将是具有挑战性的。但我认为在Yarn中使用TypeScript是有可能扩展到几十万行代码和几百个依赖项,并将安装和编译时间保持在2-3分钟以内的——当充分利用TypeScript项目引用并使用像Yarn Zero安装这样的东西时。

最新更新