有没有办法避免在使用纱线工作区和lerna构建的monorepo中进行符号链接?



假设有一个带有包AB的monorepo。

A取决于B。包B也发布在 npm 注册表中。因此,在安装依赖项时,它不会从 npm 注册表安装包B,而是按预期符号链接到本地包B

但是有没有办法避免这种行为并始终从 npm 注册表解析包?

目前,它似乎不可能开箱即用。例如,yarn中的nohoist选项适用于 monorepo 中不存在的包依赖项。例如,react-native等等。对于由其兄弟包使用的相同 monorepo 包,nohoist不起作用,我尝试在根包.json 和包上设置它。它不起作用。

请注意,我说的是"开箱即用"。

我来这里寻找解决方案,因为我想将我的自定义 ESLint 插件迁移到我的 npm 包 monorepo 中,而 npm 包 monorepo 恰好使用它们。

挑战在于,ESLint 插件不是 ESM,它们是 CJS,在 TS/纯 ESM 单存储库中,ESM 和 CJS 不能很好地协同工作。

我的 CJS ESLint 插件会被吊起来,ESLint 插件会拒绝加载它们,完全破坏了我的 VSCode linting。

我想出了一个想法来避免这种托管,方法是保留不应使用不同名称托管的 npm 包,例如B-temp,然后在 CI 上,在发布过程中,在发布到 npm 之前的最后一秒重命名它们到B

这样,在本地yarn/npm i调用期间,本地 monorepo 包B-temp不会被识别,因此不会被吊装。yarn将从互联网上获取B。我可以在 ESM 中保留b-temp(在 package.json 中设置"type": "module"(,然后使用esbuild转译为 esnext-specCJS(不转译为 ES5 等(,然后将这些dist/*.cjs.js构建发布到 npm — 除了发布之前,编辑 package.json,删除"ESM-ness" —"type": "module"exports.

最新更新