使用共享库时 Yarn 工作区的最佳实践

Posted

技术标签:

【中文标题】使用共享库时 Yarn 工作区的最佳实践【英文标题】:Yarn workspaces best practice when using shared library 【发布时间】:2020-07-21 23:24:43 【问题描述】:

我对@9​​87654323@ 有一个常见(或不太常见)的场景,但在网上找不到适合我的指南。

yarn 工作区看起来像这样:

 - monorepo
   - packages
     - client
     - admin
     - theme
     - lib 
    Client 用作我们的最终用户,它是一个 React 项目 Admin 用作管理员用户的后台,它也内置在 react 中 主题 用于所有 UI 工具包(组件)和故事书。我们在 clientadmin 中使用 UI 工具包 项目,这是经典的“monorepo 风格”(lerna)在 2 个项目之间共享组件。此文件夹应仅为此项目共享。 Lib 用于所有 API 并在多个项目之间共享“业务逻辑”。我有 4 个项目,它们对 API 请求、身份验证、Redux 等使用相同的库功能。

附加信息:

monorepo 是带有.gitmodules 的根存储库 每个子文件夹都是不同的 git 存储库 我们使用工作区是为了同时在 themeclientadmin 项目上轻松开发。

问题:

我们只在client 项目和admin 项目中运行yarn start。两个项目都使用相同的theme 和相同的lib 功能。因为lib 与其他项目共享,所以每周更新一次:

    如何防止它在项目之间更新?我应该在 git 存储库中使用 tags 还是应该从 monorepo 工作空间中删除 lib 并将其作为 npm package 使用(重点是在我们更改 lib 文件时有简单的开发过程不需要一遍又一遍地npm update。 如果lib 将是npm 包,我如何告诉monorepo 在我运行yarn start 时使用工作区并在我运行yarn build 时使用npm 版本?

请就这种情况的最佳做法提出建议。

提前致谢, 狮子座。

【问题讨论】:

您是否引用了此链接:smashingmagazine.com/2019/07/… toptal.com/front-end/guide-to-monorepos 如果没有,请参考那些他们有很好建议的链接 【参考方案1】:

这是我的个人喜好。

- monorepo
   - packages
     - client
     - admin
     - core

我认为 lib 可以移动到核心,并且主题对我来说更像是 npm 包。

【讨论】:

您的意思是 Theme 和 Lib 应该是核心存储库中的 npm 包吗? “主题”仅与该项目相关,“库”与许多项目相关...【参考方案2】:

最终答案: 我找到了对我来说的最佳解决方案,并在开发过程中尝试了 6 周(最佳实践)。

我最终得到了这个结构:

monorepo // git MAIN 存储库 包 客户端 // git 子仓库 admin // git 子仓库 主题 // git 子仓库 lib // git 子仓库

clientadmin 使用 theme 作为 yarn workspaces https://classic.yarnpkg.com/en/docs/workspaces/

libgit+ssh://git@gitlab.com:xxxx/xxx/lib.git#v1.0.1 一起用作Git npm 包

主/子存储库结构使我能够分别管理每个项目的版本控制,同时按版本使用共享的“主题”(工作区)和“lib”核心(npm)。

提示: 为了便于开发,我建议将lib 添加为yarn workspace,因为当我们运行yarn start 时,它会实时热重载更改。当我们执行yarn build 时,我们将 lib 用作带有 ssh 链接的 npm 包。

祝你好运! 狮子座。

【讨论】:

我怀疑 git submodule 通常是一个很好的解决方案。我认为这会使工作流程变得繁琐,并且可能会使 monorepo 本身的一些好处失效。

以上是关于使用共享库时 Yarn 工作区的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

共享 Android/iOS 开发的最佳实践

Flink on yarn 实时日志收集最佳实践

lerna+yarn workspace+monorepo项目的最佳实践

Spark:内存繁重的连接操作的最佳实践

使用共享库版本支持不同 ABI 的最佳实践是啥?

共享 NSDateFormatter - 最佳实践?