yarn workspaces & monorepo & monobuild 以及如何仅构建更改的内容和依赖项?

yarn workspaces & monorepo & monobuild and how to build only what changed and dependencies?

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

  1. git 状态以确定哪些文件已更改
  2. 将这些文件映射到已更改的项目
  3. 构建那些项目和依赖于它们的项目以及依赖于那些的项目

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

不要认为这里一定有一个答案,但在您的项目上下文中需要考虑许多事情:

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

总的来说,我认为拥有一个避免为所有 modules/workspaces 安装依赖项并编译所有代码的 monorepo 设置将是一项挑战。但我认为在充分利用 TypeScript project references and using something like Yarn Zero Installs 的情况下,使用 Yarn 中的 TypeScript 可以扩展到几十万行代码和数百个依赖项,并将安装和编译时间保持在 2-3 分钟以内。