好的,我發現,npm不能這樣工作。您不能從package.json全局安裝依賴項命令行工具。 感謝您指出了這一點,@Matthew Bakaitis
我通過NPM代碼昨天挖,發現了一段代碼,解釋這一行爲:
var linkStuff = build.linkStuff = function (pkg, folder, global, didRB, cb) {
// allow to opt out of linking binaries.
if (npm.config.get('bin-links') === false) return cb()
// if it's global, and folder is in {prefix}/node_modules,
// then bins are in {prefix}/bin
// otherwise, then bins are in folder/../.bin
var parent = pkg.name && pkg.name[0] === '@' ? path.dirname(path.dirname(folder)) : path.dirname(folder)
var gnm = global && npm.globalDir
var gtop = parent === gnm
log.info('linkStuff', packageId(pkg))
log.silly('linkStuff', packageId(pkg), 'has', parent, 'as its parent node_modules')
if (global) log.silly('linkStuff', packageId(pkg), 'is part of a global install')
if (gnm) log.silly('linkStuff', packageId(pkg), 'is installed into a global node_modules')
if (gtop) log.silly('linkStuff', packageId(pkg), 'is installed into the top-level global node_modules')
shouldWarn(pkg, folder, global, function() {
asyncMap(
[linkBins, linkMans, !didRB && rebuildBundles],
function (fn, cb) {
if (!fn) return cb()
log.verbose(fn.name, packageId(pkg))
fn(pkg, folder, parent, gtop, cb)
},
cb
)
})
}
由於這裏找到:https://github.com/npm/npm/blob/master/lib/build.js#L93
由於你可以在這裏看到,關於parent
變量的註釋清楚地指出,只有安裝在「根」節點模塊文件夾中的軟件包將全局鏈接,其他所有軟件包將鏈接到軟件包文件夾的.bin
中。
爲了澄清這種行爲,我會給你一個快速的例子。 所以之後我跑npm install -g
結構將是:
/usr/lib/node_modules
| --> npm
| --> gadada
正如我們所看到的,NPM創造了一個新的子文件夾的呼叫gadada
這是我在包JSON已經給出了名。在那裏放置依賴關係並在/usr/lib/node_modules/gadada/.bin
內創建鏈接。 這是因爲當建立了錯誤時,npm檢查他們擁有哪個父文件夾。如果它不是/usr/lib/node_modules
,它將不會全局鏈接。
爲了便於比較,我現在正在運行npm install -g [email protected]
的結果,會產生這個文件夾結構:
/usr/lib/node_modules
| --> npm
| --> gadada
| --> bower
在安裝NPM將實現bower
是/usr/lib/node_modules
和鏈接全球的父文件夾。
這是背後的整個巫術。 我還沒有找到任何解釋這種特定行爲的網站,但我想這是爲了防止與全局安裝的二進制文件混淆的依賴關係。
僅供說明:節點模塊的全局文件夾可能有所不同。 /usr/
只是我的前綴。
我試圖通過使用腳本來解決這個問題。我發現關於它的偉大的教程,但由於失去了隱私瀏覽:/
我建議,包括你在package.json
像這樣的scripts
部分所需要的命令:
{
"name": "gadada",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"bower": "bower"
},
"author": "me",
"dependencies": {
"bower": "latest",
},
"devDependencies": {
}
}
之前你尖叫: Nooo,究竟是什麼,完整的路徑缺失,考慮到這一點。 當您使用npm run bower
腳本運行命令時,npm包含$ PATH的.bin
文件夾,以便可以找到二進制文件。 魔術在其最好:)
我希望我可以幫助一些人偶然遇到同樣的問題:)