我在Lerna和Yarn工作区下有一个Monorepo。该仓库具有发布到npm并在monorepo以及monorepo内部使用的软件包。在monorepo中进行开发时,我们希望所有此类软件包的main
的{{1}}字段都指向package.json
目录,而当在monorepo之外使用软件包时,我们希望消费者以使用src
文件夹中的已转换代码。
我希望在软件包的所有使用中保持一致。我当前的解决方案是将dist
字段指向main
文件夹。然后,对于monorepo中的每个工具,即dist
,jest
,tsc
,webpack
,我不得不想出一个不同的工具特定解决方案来别名化parcel
目录而不是src
目录。但是我不喜欢必须为每种工具进行这项工作的事实。它似乎没有可扩展性。
是否有人提出了一个较低级别的解决方案,其中一个模块根据环境解析为另一个文件夹?
谢谢。
答案 0 :(得分: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运行),请确保使脚本看起来像这样:
"prebuild": "set-main-src"
或类似的
"build": "set-main-src && build etc"
希望这些选项之一可以为您解决。请记住,很少有必要与工具中的常规模式相提并论,反之亦然。使这个值得。