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
我有点理解这段代码在做什么(评论是我的),但有没有解释它们为什么在这里(某些用例)?
答案 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
。