1

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

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

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

谢谢你。

4

1 回答 1

0

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

然后,您可以将 main 字段保留为 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"

希望这些选项之一对您有用。请记住,几乎不值得违背工具中的常用模式流和其他什么。让这个值得。

于 2019-03-13T06:40:02.133 回答