Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request] 项目使用 umi 作为主应用并有 monorepo 管理子包时, monorepoRedirect 无法生效 #11603

Closed
zggmd opened this issue Sep 4, 2023 · 6 comments · Fixed by #11604

Comments

@zggmd
Copy link
Contributor

zggmd commented Sep 4, 2023

Background

我们公司的项目使用 umi 作为主应用并用 pnpm 管理 monorepo 子包时, 即项目结构大致如下:

app
  |__ src // 主要业务在src下
  |__ packages // 一些子 package
  |__ .umirc.ts  // 共用 umi 配置
  |__ packae.json

一个demo仓库示例

此时配置 monorepoRedirect 无法生效
原因: 根据代码 preset-umi/src/features/monorepo
/redirect.ts
会从当前项目目录的父级目录寻找 package.json
此种情况下, 得到的 rootPkg为 null

    const currentProjectRoot = process.env.APP_ROOT ? process.cwd() : api.cwd;
    const rootPkg = await pkgUp({
      // APP_ROOT: https://github.com/umijs/umi/issues/9461
      cwd: dirname(currentProjectRoot),
    });
    if (!rootPkg) return memo;

所以 monorepoRedirect 配置项此时不生效

Proposal

增加一个配置项

是否可给 monorepoRedirect 增加一个配置项, 例如取名 pkgUpFromCurrentProjectRoot, 配置为 true 时, 将直接使用 currentProjectRoot 而不是 dirname(currentProjectRoot) 作为 cwd 参数的值

本地 修改测试后, monorepoRedirect 配置项生效

讨论

另外想讨论的是, 上述场景对 monorepo 的使用是否妥当? 感觉这种还是比较普遍的场景, 如果使用不合理, 有没有比较好的方案?

@zggmd
Copy link
Contributor Author

zggmd commented Sep 4, 2023

同时, 尝试提交了个 PR #11604 增加一个配置项 monorepoRedirect.pkgUpFromCurrentProjectRoot

@fz6m
Copy link
Contributor

fz6m commented Sep 5, 2023

感谢 PR 。

这里光看 “合理性” 问题的话,是不合理的,因为 monorepo root 根的依赖是会污染所以子项目的,所有子项目都拥有了 root 所有隐形的依赖,这样你对 root 项目做依赖变更的时候所有子项目都会被影响到,那个时候子包就不知道自己的依赖到底有没有了,特别是多人合作的时候,没在子包里装依赖,也能跑通,变更了什么依赖大家都不知道,如果还要发包,就可能导致依赖缺失,循环依赖等问题,最后整个 monorepo 依赖就爆炸了,彻底变成黑盒,项目毁灭了。

所以我们在 Monorepo管理方法论和依赖安全 中要求一定要把 root 纯净化,所有的应用都是子包,尽量不要变更 root 的依赖。

但这不是绝对的,也有几个极端例外的情况,比如项目早期是单体,但后期又有 monorepo 的需求,同时不希望将整个项目都一下子重新移动放到子包里破坏 git history ,此时可以勉强接受这种根作为项目的情况;另外假如你是一个单纯的 “库” 项目,和业务应用无关,只是底层的工具,内容比较清真有限,这种方式也勉强合理。所以除了极端例外,都不应该污染全局依赖,把项目作为子包。

@zggmd
Copy link
Contributor Author

zggmd commented Sep 5, 2023

@fz6m 学习了~

刚开始使用 monorepo,对一些基本使用规范不是很明确,读了一下这篇文章 Monorepo管理方法论和依赖安全 收获不少

我们公司的项目确实是先有的单体项目,后来有些共用方法代码想要共享给别的项目使用,所有在单体项目基础上增加了 monorepo,共享的代码再单独发包,也就遇到了上述问题。

pr中提到的问题我也改一下~

@zggmd
Copy link
Contributor Author

zggmd commented Sep 15, 2023

@fz6m 看到 umi 以及 @umijs/preset-umi 发布了新版本4.0.81,umi官网有了相关 monorepoRedirect.useRootProject 文档描述,但实际使用中 monorepoRedirect.useRootProject 并未生效

排查 @umijs/[email protected] 代码中确实没有 monorepoRedirect.useRootProject 相关代码

看了下 History for umi/packages/preset-umi, 好像是 先
release: 4.0.81feat(monorepo): add monorepoRedirect.useRootProject ,是否是这个原因导致文档中有相关介绍,实际功能却没有? 😂
image

@fz6m
Copy link
Contributor

fz6m commented Sep 15, 2023

文档是实时生效的,这周发版没有包含那个 monorepo 的 PR ,等下周发 4.0.82 后才可以用。

@zggmd
Copy link
Contributor Author

zggmd commented Sep 15, 2023

了解了,感谢~ @fz6m

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants