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

时间:2015-02-09 14:04:31

标签: node.js plugins npm

我正在编写一个实用程序(用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. 如果它根本不受支持,有没有其他选择?例如,我能想到的一个替代方案是强制用户在每个项目的本地安装额外的模块(但是,这不是一个很好的解决方案IMO)。

2 个答案:

答案 0 :(得分:0)

查看可以帮助解决全局/本地CLI问题的liftoff。也许你使用它,但也许你只是阅读它的想法。我认为当前的策略是如果你必须在全局安装一些东西,只需要一个小的myutil包装器包,它应该只在some-users-project/node_modules/myutil内找到本地包。没有理由将插件全局安装,因为它们不能直接在命令行上运行,因此这些插件只能在本地安装。

  

我能想到的是强迫用户在每个项目中本地安装额外的模块(但是,这不是一个很好的解决方案IMO)。

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

答案 1 :(得分:0)

另一个答案并没有真正回答这个问题,所以对于未来的访问者,我会发布我的实际解决方案。

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

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