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

时间:2017-01-23 14:09:45

标签: node.js 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

我有点理解这段代码在做什么(评论是我的),但有没有解释它们为什么在这里(某些用例)?

1 个答案:

答案 0 :(得分:3)

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

else分支仅使用node,这意味着输入的二进制文件与您相同:

which node

这是node环境变量中某个目录中的第一个PATH

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

顺便说一下,这是我更喜欢从源代码安装Node而不是从二进制包安装Node的原因之一,因为如果我安装了多个版本,我的npm脚本可能会运行错误的node。有关详细信息,请参阅节点安装的my tutorial

Thye Cygwin测试检查uname命令的输出是否包含单词CYGWIN,在这种情况下使用cygpath -w "$basedir"使用Cygwin特定的路径解析。 Cygwin是GNU和开源工具的集合,提供类似于Windows上的Linux发行版的功能 - 请参阅:https://www.cygwin.com/ - 它会进行一些路径转换,以便为Unix和Linux编写的脚本在Windows上运行。对于Linux,uname的输出仅为Linux。在Cygwin上它包含CYGWIN