如何从单个Node项目发布多个NPM模块?

18
这个问题很简单:是否有一种方法可以从单个nodejs项目向npmjs注册表发布两个不同的NPM模块?
但是对于那些想知道为什么会有人这样做的人来说,这个问题背后的动机可能并不太明显。所以让我解释一下:
我使用类似于应用服务器的东西,叫做loopback。我的nodejs应用程序被整齐地分成了客户端、公共和服务器文件夹。
我经常需要在其他项目中重复使用我的common文件夹中的模型。虽然我可以使用.npmignore将其他内容删除并将该文件夹作为单独的NPM模块发布:
/* /common/utils /common/models/*.js !/common/models/*.json
但我无法从已发布的内容中删除当前package.json中需要运行应用程序的混乱信息。目前的情况是,我过滤掉了除了我的common/models文件夹之外的所有内容,但由于我不确定如何在打包之前动态调整package.json文件,或者将其作为打包的一部分...一个npm install命令将安装实际上不需要的依赖项。
我不喜欢创建一个只包含模型的单独项目,因为这迫使我将其作为核心项目的依赖项添加进去,并且主动开发会在原本只有一个项目的情况下分裂成2个项目。npm link等是一个解决方法,但它会增加开发人员设置的复杂性,并确保没有人提交错误的内容。

那么,是否有一种方法可以从单个Node.js项目向npmjs注册表发布两个不同的NPM模块?或者有没有办法为单独的发布使用不同的package.json文件,但所有发布都来自同一个项目?


更新:我的目标是什么?

通过将它们作为NPM模块发布,重复使用核心项目中的模型,用于其他项目。而且不放弃继续将核心项目作为一个原子实体进行开发的便利性,而无需使用npm link等方法,因为当多人参与时,这样做会使情况变得混乱。


1
"虽然我可以将该文件夹作为单独的NPM模块发布" > 太好了。 "通过使用.npmignore来删除其他内容..." ...嗯?你不能将它从应用程序中分离出来,像require('common')一样在应用程序中使用吗?也许您可以发布一些最小代码,如package.json和文件结构,以更好地了解您的情况。 - laggingreflex
@laggingreflex - 更新了语言...至于将其与应用程序分开...正如我在第2点中指出的那样,我提出这个问题是因为我不想这样做,我想要在这方面推动一下创新。 - pulkitsinghal
我希望大家在给我点踩的时候,能够提供一些理由,而不是让我猜测。 - pulkitsinghal
您产生了一个X-Y问题。您最初的目标是将常见代码分离并在两个单独的项目中使用,这很好!但是,您提出的解决方案存在误导性,可能会带来更多的伤害而不是好处。您不应该问“如何发布多个NPM模块...”,而应该询问一个能够帮助您实现最初目标的问题,并提供更多详细信息,例如common中确切包含什么以及它如何与您的项目交互。 - laggingreflex
当我写下“因为这会强制我将其作为核心项目的依赖项添加,并且活跃的开发会分散到两个项目中,而不是只有一个项目”时,我是否没有满足这个要求:“不要试图避免再次讨论它们 - 相反,说明你为什么排除了它们”? - pulkitsinghal
我已经删除了loopbackjs,因为我不想与社区对抗,但是对于建议这个编辑的人,请注意,尽管此情况对任何nodejs用户都很常见... 但对于试图将模块化的loopbackjs用户来说肯定是相关的... 因为模型被烘焙到他们的框架中,并自然地可以被重复使用。但是我想,在您尝试获取关于他们可能已经解决的此主题的反馈时,针对同伴loopbackjs用户是错误的吗?因此,是的,我采纳了您的建议并删除了该标记。 - pulkitsinghal
1个回答

12

我最近发现一个类似的问题:https://github.com/lerna/lerna,这可能对你有用。

从自述文件中可以看到:

将大型代码库分割成独立版本的软件包非常有用,可用于代码共享。然而,跨多个存储库进行更改很混乱且难以跟踪,并且跨存储库进行测试会非常复杂。

为了解决这些(以及其他许多)问题,一些项目将其代码库组织成多软件包存储库(有时称为monorepos)。像Babel、React、Angular、Ember、Meteor、Jest等项目都在单个存储库中开发所有软件包。

Lerna是一种优化使用git和npm管理多软件包存储库的工作流程的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接