2017-01-23 67 views
1

node_modules/.bin每個二進制有以下代碼:爲什麼二進制NPM文件有兩個檢查

#!/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" "[email protected]" 
    ret=$? 
else 
    node "$basedir/../angular-cli/bin/ng" "[email protected]" 
    ret=$? 
fi 
exit $ret 

我有點明白這是什麼代碼正在做(評論是我的),但有沒有什麼地方解釋爲什麼他們在這裏(一些用例)?

回答

3

檢查同一目錄中的node二進制文件適用於全局安裝此模塊並且可執行文件與節點位於同一位置的情況。它確保它使用與安裝它相同的node,即使您的PATH中有其他節點。

else分支只使用node這意味着當你鍵入得到相同的二進制:

which node 

這是在PATH環境變量中的目錄之一的第一node

安裝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

+0

謝謝_當這個模塊被全局安裝並且有一個可執行文件與Node_在同一個地方 - 但是腳本假定你運行的是直接放在帶節點的文件夾中的可執行文件,而不是'node_modules /中的文件。 bin',對嗎?那麼用'uname'檢查呢? –

+0

對'uname'的支票有任何評論? –

+0

@Maximus我在'uname'檢查中添加了信息。看到我更新的答案。 – rsp

相關問題