npm link命令可以將一個任意位置的npm包鏈接到全局執(zhí)行環(huán)境吱七,從而在任意位置使用命令行都可以直接運行該npm包昭齐。
那么,當運行npm link時發(fā)生了什么胎源?
下面就以Windows平臺為例來展示它的處理過程译株。
簡要地講瓜喇,這個命令主要做了兩件事:
為npm包目錄創(chuàng)建軟鏈接,將其鏈到{prefix}/lib/node_modules/<package>
為可執(zhí)行文件(bin)創(chuàng)建軟鏈接古戴,將其鏈到{prefix}/bin/{name}
以上兩個路徑是官方文檔給出的路徑欠橘,這兩個路徑是Linux平臺上的矩肩。在Windows平臺中现恼,這兩個路徑為:
目錄: C:\Users\{Username}\AppData\Roaming\npm\node_modules\<package>
文件: C:\Users\{Username}\AppData\Roaming\npm\<name>
并且對于可執(zhí)行文件(bin)的處理并不僅僅創(chuàng)建了文件的軟鏈接。接下來通過一個實例來看一下黍檩。
首先叉袍,創(chuàng)建如下目錄:
C:\code\tool
1
在這個路徑中執(zhí)行:
npm init -f
1
執(zhí)行之后,目錄中生成了package.json文件刽酱,用編輯器打開它喳逛,其內(nèi)容為:
{
? "name": "tool",
? "version": "1.0.0",
? "description": "",
? "main": "index.js",
? "scripts": {
? ? "test": "echo \"Error: no test specified\" && exit 1"
? },
? "keywords": [],
? "author": "",
? "license": "ISC"
}
1
2
3
4
5
6
7
8
9
10
11
12
在里面添加一個字段,表示本npm包的可執(zhí)行文件位于bin/foo:
"bin": "bin/foo"
1
在C:\code\tool中創(chuàng)建目錄bin, 并在bin中創(chuàng)建文件foo棵里,這便是本npm包的可執(zhí)行文件润文。
用編輯器打開foo,輸入代碼并保存:
#!/usr/bin/env node
console.log('foo run success');
1
2
3
在C:\code\tool中執(zhí)行以下命令可看到輸出foo run success:
node bin/foo
1
接下來殿怜,執(zhí)行鏈接命令:
npm link
1
可以看到輸出內(nèi)容為:
...
C:\Users\{Username}\AppData\Roaming\npm\tool -> C:\Users\{Username}\AppData\Roaming\npm\node_modules\tool\bin\foo
C:\Users\{Username}\AppData\Roaming\npm\node_modules\tool -> C:\code\tool
1
2
3
4
5
此時典蝌,在任意一個位置執(zhí)行以下命令都可以看到輸出foo run success:
tool
1
使命令在全局環(huán)境可運行,這就是npm link的作用了头谜。
此時進入到C:\Users\{Username}\AppData\Roaming\npm\node_modules\中發(fā)現(xiàn)有個名為tool的目錄骏掀,從其圖標可以看出它類似一個快捷方式,實際是一個軟鏈接柱告,指向C:\code\tool截驮。
而在C:\Users\{Username}\AppData\Roaming\npm\中可看到有以下兩個文件:
tool
tool.cmd
之所以這里生成的文件叫tool,是因為package.json中的name字段值為tool际度,而name字段的值又是執(zhí)行npm init -f時根據(jù)目錄名確定的葵袭。
tool文件里是一段Shell腳本,而tool.cmd里是一段cmd腳本乖菱,兩者的作用都是去調(diào)用C:\Users\{Username}\AppData\Roaming\npm\node_modules\tool\bin\foo這個可執(zhí)行文件眶熬。
由此可以合理推測:
tool文件是在git-bash之類的工具中執(zhí)行tool命令時運行的腳本
tool.cmd文件是在Windows的CMD中執(zhí)行tool命令時運行的腳本
打開tool文件妹笆,在倒數(shù)第二行加上一句
echo 'from shell'
1
再打開tool.cmd文件,在最后一行加上一句
ECHO "from cmd"
1
保存之后娜氏,分別在git-bash和cmd中執(zhí)行tool命令拳缠,便可以發(fā)現(xiàn)git-bash中輸出foo run success之后又輸出了from shell,而cmd中輸出foo run success之后又輸出了from cmd贸弥,證明推論正確窟坐。
最后總結(jié)一下:
npm link命令通過鏈接目錄和可執(zhí)行文件,實現(xiàn)npm包命令的全局可執(zhí)行绵疲。