NPM - 全球路径的条件添加

时间:2016-01-13 02:54:06

标签: node.js path npm

在节点package.json文件中,您可以在全局NPM安装(PATH)上将多个可执行文件映射到npm install -g环境变量:

"bin": {
  "foo": "./bin/foo.js",
  "bar": "./bin/bar.js"
},

我有一个独特的项目,需要在没有它的操作系统上映射现有的PATH变量。例如,我想要将名为grep的命令添加到PATH当且仅当安装在Windows计算机上时。如果计算机正在运行任何其他操作系统,则NPM安装显然会失败。

有没有办法运行预先确定安装中可用的bin选项的逻辑?

哦 - 我只是有个主意!

这会有效吗?

  1. 父模块将npm(程序化版本)作为依赖项。
  2. 在全局安装中,运行父模块的package.json中声明的安装后脚本。
  3. 安装后脚本会检查系统以查看存在哪些命令。这比“Windows或不是Windows”更成熟 - 它会尝试执行命令列表并查看哪些命令失败。
  4. 对于每个不存在的命令,安装后脚本以编程方式在所有子模块上运行npm install -g(每个命令一个,例如grep)。
  5. 这需要一段时间,npm模块很大,但看起来它会起作用。否?

1 个答案:

答案 0 :(得分:1)

似乎没有办法通过package.json直接执行此操作,但可能(并且可取)执行以下操作:

  • 为要注册的每个可执行文件创建一个单独的npm模块(例如 my-win-grep )。
  • my-win-grep 模块中,实现您要运行的可执行代码,并在此模块中注册PATH / executable值。
  • 在{{1>} for my-win-grep 中,添加一个package.json字段,将其限制为在Windows上安装。
  • 在原始模块中,将 my-win-grep 列为os

通过这种方式,如果有人在Windows上安装原始模块,它将安装 my-win-grep ,这将注册一个可执行文件以在optionalDependency命令下运行。

对于其他系统上的用户,由于grep要求, my-win-grep 模块将无法安装,但主模块将继续安装,因为它忽略了{下的故障{1}}。因此原始的os可执行文件将保持不变。

更新了问题

这种方法听起来应该可行 - 正如你所说,npm依赖性相当大,但它确实避免了必须预先形成额外的符号链接,并且仍然具有上面概述的每个操作系统特定功能的优点。单独的模块。

唯一需要关注的是程序化的npm文档:

  

您无法单独为任何单个npm函数设置配置   这次。因为npm是一个单例,所以对npm.config.set的任何调用都会   更改该进程中所有npm命令的值

因此,这可能只是意味着您无法在安装时指定optionalDependencies,而是必须在首次安装之前全局设置它。这不应该是一个问题,但你可能需要测试它才能找到确切的结果。

<强>最后...

您可能还想查看https://github.com/lastboy/package-script - 即使您不使用它,也可能会为您的实施提供一些灵感。