これは、npmがそのように機能しないことが分かりました。依存関係コマンドラインツールは、package.jsonからグローバルにインストールすることはできません。ここに見られるような
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
として は、私は昨日のNPMコードを掘って、この動作を説明するコードの一部を発見し、それを指摘するために@Matthew Bakaitis
をありがとうparent
についてのコメントは、 "root"ノードモジュールフォルダにインストールされたパッケージのみがグローバルにリンクされ、その他はすべてパッケージフォルダの.bin
にリンクされることが明確に指摘されています。
この動作を明確にするために、私はあなたに簡単な例を挙げます。 は、だから私はnpm install -g
を実行した後の構造は次のようになります。
/usr/lib/node_modules
| --> npm
| --> gadada
私たちが見ることができるように
は、NPMは、私は私のパッケージJSONで指定した名前の新しいサブフォルダコール
gadada
を作成しました。そこには依存関係が配置され、リンクは
/usr/lib/node_modules/gadada/.bin
に作成されます。 dependencyが構築されている場合、npmはそれらの親フォルダを確認するためです。
/usr/lib/node_modules
でない場合は、グローバルにリンクされません。比較のために
、今npm install -g [email protected]
を実行している私の結果は、このフォルダ構造を生成します:インストールNPMで
/usr/lib/node_modules
| --> npm
| --> gadada
| --> bower
はbower
の親フォルダがグローバル/usr/lib/node_modules
とリンクで実現します。
これはその背後にあるブードー全体です。 この特定の動作を説明しているサイトは見つかりませんでしたが、バイナリのグローバルインストールとの依存関係を妨げることはないと思います。
説明のために、ノードモジュールのグローバルフォルダが異なる場合があります。 /usr/
は私の接頭辞です。
私は `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": {
}
}
あなたが悲鳴を上げる前に:/
私はあなたがこのようなあなたのpackage.json
のscripts
セクションに必要なコマンドを含めることが示唆:私はそれについての素晴らしいチュートリアルを見つけましたが、原因プライベートブラウジングにそれを失いました:いいえ、何が、まったくの道が見当たりません、これを考えてみてください。 npm run bower
のスクリプトからコマンドを実行すると、npmに$ PATHの.bin
フォルダが含まれているため、バイナリが見つかるようになります。 最高の魔法:
私は同じ問題を抱えている人を助けることができたらいいと思っています:)