为什么二进制npm文件有两个检查

node_modules/.bin中的每个二进制文件都有以下代码:

 #!/bin/sh basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") case `uname` in *CYGWIN*) basedir=`cygpath -w "$basedir"`;; esac # check if there is node executable in the same directory as this binary if [ -x "$basedir/node" ]; then "$basedir/node" "$basedir/../angular-cli/bin/ng" "$@" ret=$? else node "$basedir/../angular-cli/bin/ng" "$@" ret=$? fi exit $ret 

我有点理解这个代码在做什么(注释是我的),但有没有解释他们为什么在这里(一些用例)?

检查同一目录中的node二进制文件是针对全局安装此模块并且与节点位于同一位置的可执行文件的情况。 它确保它使用与安装它相同的node ,即使在PATH中有其他节点。

else分支只使用node ,这意味着您input的是相同的二进制文件:

 which node 

这是PATH环境variables中的一个目录中的第一个node

安装Node脚本的问题是,他们必须有一些shebang线。 人们通常使用#!/usr/bin/env node来运行PATH中的任何node 。 但是它可能与实际用于安装该脚本的node (可能不兼容)不同。

顺便说一句,这是我喜欢从源安装节点的原因之一,而不是从二进制包,否则我的npm脚本可以运行错误的node如果我有多个版本安装。 有关详细信息,请参阅我的节点安装教程

Thye Cygwintesting检查uname命令的输出是否包含单词CYGWIN,在这种情况下,使用cygpath -w "$basedir"使用Cygwin特定的path分辨率。 Cygwin是GNU和开源工具的集合,它提供的function类似于Windows上的Linux发行版 – 请参阅: https : //www.cygwin.com/ – 它可以进行一些path转换,以便为Unix和Linux编写脚本视窗。 对于Linux来说, uname的输出只是Linux 。 在Cygwin上它包含CYGWIN