在 Node package.json
文件中,您可以将多个可执行文件映射到全局 NPM 安装 (npm install -g
) 上的 PATH
环境变量:
"bin": {
"foo": "./bin/foo.js",
"bar": "./bin/bar.js"
},
我有一个独特的项目,需要在没有该变量的操作系统上映射现有的 PATH
变量。例如,我想将名为 grep
的命令添加到 PATH
,当且仅当它安装在 Windows 计算机上。如果计算机运行任何其他操作系统,NPM 安装显然会失败。
是否有任何方法可以运行预先确定安装中可用的 bin
选项的逻辑?
哦,天哪 - 我刚刚有了一个主意!
这行得通吗:
- 父模块有
npm
(编程版本)作为依赖项。 - 在全局安装时,运行父模块的
package.json
中声明的安装后脚本。 - 安装后脚本会检查系统以查看存在哪些命令。这将比“Windows 或非 Windows”更成熟 - 它将尝试执行一系列命令并查看哪些命令失败。
- 对于每一个不存在的命令,安装后脚本都会以编程方式在所有子模块上运行
npm install -g
(每个命令一个,例如grep
)。
这需要一段时间,而且 npm
模块很大,但看起来它可以工作。没有?
最佳答案
似乎没有办法直接通过 package.json
执行此操作,但可能(并且值得)执行以下操作:
- 为您要注册的每个可执行文件创建一个单独的 npm 模块(例如 my-win-grep)。
- 在my-win-grep模块中,实现要运行的可执行代码,并在此模块中注册
PATH
/executable值。 - 在 my-win-grep 的
package.json
中,包含一个os
字段,限制其安装在 Windows 上。 - 在原始模块中,将my-win-grep列为
可选依赖项
。
这样,如果有人在 Windows 上安装您的原始模块,它将安装 my-win-grep,它将注册一个可执行文件以在 grep
命令下运行。
对于其他系统上的用户,由于 os
要求,my-win-grep 模块不会安装,但主模块将继续安装,因为它会忽略 optionalDependencies
下的故障。因此,原始的 grep
可执行文件将保持不变。
更新问题
这种方法听起来确实应该可行 - 正如您所说,npm 依赖性非常大,但它确实避免了必须执行额外的符号链接(symbolic link),并且仍然具有上面概述的将每个操作系统特定功能放在单独的模块中的好处。
程序化 npm 文档中唯一需要注意的可能是:
You cannot set configs individually for any single npm function at this time. Since npm is a singleton, any call to npm.config.set will change the value for all npm commands in that process
因此,这可能意味着您无法在安装时指定 -g
,而必须在首次安装之前进行全局设置。这应该不是问题,但您可能需要对其进行测试才能准确找到答案。
最后...
您可能还想查看https://github.com/lastboy/package-script - 即使您不使用它,它也可能会给您的实现带来一些灵感。
关于node.js - NPM - 有条件添加全局路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34757624/