我正在编写一个实用程序(用Node.js编写),它将从命令行调用。具体细节并不重要,但功能可以分解为独立的不相关模块,每个模块都可以独立地贡献最终结果。
例如,我可以调用:
npm install -g myutil #installs modulea and moduleb
myutil #invokes said modules
假设存在模块modulea
和moduleb
,目前,所有这些模块都捆绑在myutil
的依赖项中,但在理想情况下,我希望将它们分开,并单独安装,以便其他人编写模块
npm install -g myutil-contrib-modulec
然后在运行时检测myutil-contrib-modulec
,并像其他任何东西一样使用它。
1.这是个好主意吗?
1.有没有一种支持的方法来做到这一点?FAQ建议全局模块应该是完全独立的,但我认为这是一个合理的用例。
1.如果它根本不受支持,有什么替代方案吗?例如,我能想到的一个替代方案是强制用户在每个项目本地安装额外的模块(但是,这不是一个很好的解决方案IMO)。
3条答案
按热度按时间pzfprimi1#
看一下liftoff,它可以帮助解决全局/本地CLI问题。也许你使用它,但也许你只是为了获得灵感而阅读它。我认为当前的策略是,如果你必须全局安装一些东西,使它成为一个很小的
myutil
Package 器包,它应该只定位some-users-project/node_modules/myutil
中的本地包。没有理由将插件全局安装,因为它们不会“t不能直接在命令行上运行,所以这些应该只在本地运行。我能想到的是强迫用户在本地安装额外的模块(但是,这不是一个很好的解决方案IMO)。
我的观点是
npm -g
通常是一个糟糕的想法,可悲的是人们无法调整他们的PATH环境变量或设置shell别名,但是我可以理解为什么你要全局安装myutil
。想要全局安装所有插件可能是错误的。但是这取决于myutil
的确切功能以及它与使用它的项目的耦合程度。从我的Angular 来看,我希望所有的东西都是本地的,包括节点本身。我希望我的项目是独立的。我不希望为项目A更新myutil
,而使项目B作为一个副作用而中断。vltsax252#
另一个答案并没有真正回答这个问题,所以对于未来的访问者,我将张贴我的实际解决方案。
我最终放弃了全球安装插件的想法。相反,我将插件与工具捆绑在一起。为了支持自定义插件,我允许用户在本地安装它们。
加载插件的代码遵循与节点本身类似的规则,所以如果你真的想以全局方式安装插件,只需将其放在目录树的更高位置。
ef1yzkbh3#
在某些情况下,你可以使用Oclif。插件将被全局安装在用户的计算机上。Here解释了用户如何使用它为CLI构建插件。
Heroku CLI使用Oclif。请查看他们的developing a plugin,了解他们如何处理它。