【问题标题】:Pointing the main field in package.json conditionally有条件地指向 package.json 中的 main 字段
【发布时间】:2019-03-06 01:05:00
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    如果您的内部代码库总是在转换源代码,为什么不直接使用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"

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

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 2017-08-31
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      相关资源
      最近更新 更多