有条件地指向 package.json 中的主字段

Ham*_*aee 5 node.js npm monorepo yarnpkg yarn-workspaces

我在 Lerna 和 Yarn 工作区下有一个 Monorepo。该存储库包含发布到 npm 并在 monorepo 外部和 monorepo 内部使用的包。在 monorepo 中开发时,我们希望所有此类包的main字段都package.json指向该src目录,而当在 monorepo 外部使用包时,我们希望使用者使用文件夹中的转译代码dist

我希望这在包的所有使用中保持一致,我当前的解决方案是让字段main指向dist文件夹。然后,对于 monorepo 中的每个工具,即jesttscwebpackparcel我必须想出一个不同的工具特定解决方案来为src目录而不是dist目录设置别名。但我不喜欢这样的事实:我必须为每个工具做这项工作。它似乎无法扩展。

有没有人提出一个较低级别的解决方案,其中模块根据环境解析到不同的文件夹?

谢谢。

Wil*_*ing 1

如果您的内部代码库总是转换源代码,为什么不直接编译呢import { thing } from "my-package/src/main.js

然后,您可以将主字段保留为 dist ,以便消费者在理想情况下不必在导入包时跟踪其他路径。

您的答案中留下了很多细节,但假设您使用单个 webpack/其他实例来编译所有包。

另一种方法,既然您已经通过相同的编译步骤耦合了所有包,为什么不只使用包之间的相对路径呢?这样,您就不必充当消费者,但需求略有不同。

最后是第三种方法,我认为这听起来有点复杂,但应该完全符合您的要求。创建一个脚本,使用 globby 或其他一些 npm 包来获取存储库中的所有 package.json 文件(不包括 node_modules!)。require() / 迭代这些 package.json 清单文件并将主字段设置为输入值(例如“dist”)。然后,创建两个名为 set-main-dist 和 set-main-src 的 bin js 文件(提示:bin 字段),可能还创建第三个名为 unset-main 的文件。

接下来,无论您在根目录的 package.json 文件中运行什么脚本(或使用 lerna run),请确保让脚本看起来像这样:

"prebuild": "set-main-src"

或者像这样

"build": "set-main-src && build etc"

希望这些选项之一适合您。请记住,很少值得违背工具等方面的常见模式。让这个值得。