假设有一个带有包A
和B
的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
.