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

cunj1qz1  于 2023-02-18  发布在  Node.js
关注(0)|答案(2)|浏览(103)

我在Lerna和Yarn工作区下有一个Monorepo。这个repo有一些包被发布到npm,并且在monorepo之外和monorepo之内使用。当在monorepo中开发时,我们希望所有这样的包的package.jsonmain字段指向src目录,而当一个包在monorepo之外使用时,我们希望消费者使用dist文件夹中的所传播的代码。
我希望这在包的所有使用中都是一致的,我目前的解决方案是让main字段指向dist文件夹,然后对于monorepo中的每个工具,即jesttscwebpackparcel我不得不想出一个不同的工具特定的解决方案来别名src目录而不是dist目录。我不得不为每一个工具做这些工作,只是看起来没有可伸缩性。
有没有人提出一个较低级别的解决方案,其中一个模块根据环境解析到一个不同的文件夹?
谢谢你。

cngwdvgl

cngwdvgl1#

如果您的内部代码库总是在泄漏源代码,为什么不使用import { thing } from "my-package/src/main.js呢?
然后,您可以将主字段保留为dist,以便用户在导入包时不必跟踪其他路径。
你的答案中有很多细节,但是假设你使用一个webpack/other示例来编译你所有的包。
另一种方法是,既然你已经通过同一个编译步骤耦合了所有的包,为什么不使用包之间的相对路径呢?这样你就永远不必扮演消费者的角色,只是需要稍微不同的需求。
最后是第三种方法,我认为它听起来有点复杂,但应该完全满足您的要求。创建一个脚本,使用globby或其他一些npm包来获取存储库中的所有package.json文件(不包括node_modules!)。require()/iterate遍历这些package.json清单文件,并将main字段设置为一个输入值(比如"dist")。然后,创建两个bin js文件(提示:bin字段),称为set-main-dist和set-main-src,并且可能还有第三个称为unset-main。
接下来,无论您在根目录下的package.json文件中运行什么脚本(或者使用lerna run),都要确保脚本如下所示:
"prebuild": "set-main-src"
或者像这样
"build": "set-main-src && build etc"
希望这些选择中的一个能为你工作。记住,在工具和其他东西中违反常规模式流是不值得的。让这一个值得。

cgfeq70w

cgfeq70w2#

我遇到了完全相同的困境,只是用的是Yarn。
总是从源代码dint导入的解决方案对我的情况有效,因为包本身也可能发布到npm。
因此,经过深入研究,我幸运地找到了package.json属性publishConfig.mainhttps://yarnpkg.com/configuration/manifest#publishConfig
使用它我可以在npm publish上将主字段从source改为dist,基本上只有在发布时我们才使用修改过的package.json。
在我的package.json中实现,它看起来像这样:

{
   "main": "./src/index.ts",
   "publishConfig": {
     "main": "./dist/index.js"
   }
}

并且当我运行yarn npm publishyarn pack时,main字段将被临时替换为zip,而我的所有工具(jest和ts)仍然可以依赖指向源的main字段。

相关问题