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

时间:2019-03-06 01:05:00

标签: node.js npm yarnpkg monorepo yarn-workspaces

我在Lerna和Yarn工作区下有一个Monorepo。该仓库具有发布到npm并在monorepo以及monorepo内部使用的软件包。在monorepo中进行开发时,我们希望所有此类软件包的main的{​​{1}}字段都指向package.json目录,而当在monorepo之外使用软件包时,我们希望消费者以使用src文件夹中的已转换代码。

我希望在软件包的所有使用中保持一致。我当前的解决方案是将dist字段指向main文件夹。然后,对于monorepo中的每个工具,即distjesttscwebpack,我不得不想出一个不同的工具特定解决方案来别名化parcel目录而不是src目录。但是我不喜欢必须为每种工具进行这项工作的事实。它似乎没有可扩展性。

是否有人提出了一个较低级别的解决方案,其中一个模块根据环境解析为另一个文件夹?

谢谢。

1 个答案:

答案 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"

希望这些选项之一可以为您解决。请记住,很少有必要与工具中的常规模式相提并论,反之亦然。使这个值得。