node.js - NPM - 有条件添加全局路径

标签 node.js path npm

在 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 或非 Windows”更成熟 - 它将尝试执行一系列命令并查看哪些命令失败。
  4. 对于每一个不存在的命令,安装后脚本都会以编程方式在所有子模块上运行 npm install -g(每个命令一个,例如 grep)。

这需要一段时间,而且 npm 模块很大,但看起来它可以工作。没有?

最佳答案

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

  • 为您要注册的每个可执行文件创建一个单独的 npm 模块(例如 my-win-grep)。
  • my-win-grep模块中,实现要运行的可执行代码,并在此模块中注册PATH/executable值。
  • my-win-greppackage.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/

相关文章:

javascript - ng2-split-pane 在初始渲染后调整垂直 Pane 的高度

npm - 使用 Gulp 时捕获和处理 Uglify 错误

selenium-webdriver - 如何使用 NPM 更新适用于 Windows 的 ChromeDriver?

javascript - 模块范围变量拒绝被异步函数覆盖。为什么?

javascript - 如何提高JS函数式代码的性能

javascript - 从 HTML 请求执行 Javascript 函数

linux - cron 实用程序的问题

json - 将SVG转换为JSON

javascript - node.js,express,如何从post请求中的body表单数据中获取数据

python 没有使用最新的 numpy 版本