【问题标题】:NPM - Conditional additions to global pathNPM - 全局路径的条件添加
【发布时间】:2016-01-13 02:54:06
【问题描述】:

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

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

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


有什么方法可以运行预先确定安装中可用的bin 选项的逻辑吗?


哦,快——我刚刚有个主意!

这行得通吗:

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

这需要一段时间,npm 模块很大,但它似乎可以工作。没有?

【问题讨论】:

    标签: node.js path npm


    【解决方案1】:

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

    • 为每个要注册的可执行文件创建一个单独的 npm 模块(例如 my-win-grep)。
    • my-win-grep模块中,实现你要运行的可执行代码,并在该模块中注册PATH/executable值。
    • my-win-greppackage.json 中,包含一个 os 字段,将其限制为只能在 Windows 上安装。
    • 在您的原始模块中,将 my-win-grep 列为 optionalDependency

    这样,如果有人在 Windows 上安装您的原始模块,它会安装 my-win-grep,它会注册一个可执行文件以在 grep 命令下运行。

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

    更新问题

    这种方法听起来确实应该有效 - 正如您所说,npm 依赖关系非常大,但它确实避免了必须执行额外的符号链接,并且仍然具有上面概述的每个操作系统特定功能的好处单独的模块。

    在程序化的 npm 文档中,唯一需要注意的可能是:

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

    所以这可能只是意味着您不能在安装时指定-g,而是必须在第一次安装之前全局设置它。这应该不是问题,但您可能需要对其进行测试才能准确找出答案。

    最后...

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

    【讨论】:

    • 聪明。但我怀疑每个可选依赖项都会作为全局模块安装?为了注册my-win-grep 路径,它必须是全局安装的。赢你-g 安装一个父包,它不会将所有子包全局添加到path,是吗?
    • 是的,但根据文档,它仍然会在本地进行符号链接。您可以(?)然后在 my-win-grep 中使用 postInstall 挂钩来对它进行全局符号链接。
    • 好点。你能看看我关于你刚刚激发的新想法的问题更新吗?别担心 - 我仍然会接受你的赏金回答! :)
    • 很好的建议,谢谢,package-script 是一个很棒的链接。这可能会起作用,并且取决于 NPM 模块。
    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2016-01-23
    • 2010-10-19
    • 2019-03-12
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多