如何支持 node.js 命令行实用程序的插件?

How do I support plugins for a node.js command line utility?

我正在编写一个实用程序(用 Node.js 编写),它将从命令行调用。具体细节并不重要,但功能可以分解为独立的不相关模块,每个模块都可以独立地为最终结果做出贡献。

例如,我可以调用:

npm install -g myutil   #installs modulea and moduleb
myutil                  #invokes said modules

假设存在模块 moduleamoduleb。目前,所有这些模块都被捆绑为 myutil 的依赖项,但在理想情况下,我想将它们拆分出来并单独安装,以允许其他人编写模块

npm install -g myutil-contrib-modulec

然后在运行时检测 myutil-contrib-modulec 并像其他所有东西一样使用它。但是,围绕它有一些问题:

  1. 这是个好主意吗?
  2. 有支持的方法吗?常见问题解答表明全局模块应该是完全独立的,但我想这是一个合理的用例。
  3. 如果完全不支持,还有其他选择吗?例如,我能想到的一种替代方法是强制用户在每个项目本地安装额外的模块(但是,在我看来,这不是一个很好的解决方案)。

查看 liftoff 可以帮助解决 global/local CLI 问题。也许你使用它,但也许你只是为了想法而阅读它。我认为当前的策略是,如果您必须在全局范围内安装某些东西,请将其设置为一个很小的 ​​myutil 包装程序包,它应该将本地程序包定位在 some-users-project/node_modules/myutil 中。没有理由在全局安装插件,因为它们不会直接在命令行上 运行,所以它们应该只在本地安装。

I could think of is to force the user to install the extra modules locally per project (but, that's not a great solution IMO).

我的意见是 npm -g 通常是个糟糕的主意。令人遗憾的是人们无法调整他们的 PATH 环境变量或设置 shell 别名,但我能理解你为什么要全局安装 myutil。想要全局安装所有插件可能是错误的。但这完全取决于 myutil 的作用以及它与使用它的项目的耦合程度。从我的角度来看,我想要本地的一切,包括节点本身。我希望我的项目独立。我不想为项目 A 更新 myutil 并且作为副作用让项目 B 中断。

其他答案并没有真正回答问题,因此对于未来的访问者,我将 post 我的实际解决方案。

我最终放弃了全局安装插件的想法。相反,我将插件与该工具捆绑在一起。为了支持自定义插件,我允许用户在本地安装它们。

加载插件的代码与rules as node itself类似,所以如果你真的想以全局方式安装插件,只需将它放在目录树的较高位置即可。