2016-06-15 11 views
1

をリンクしません:NPMグローバルインストールは私のセットアップは、以下であるバイナリ

  • 利用できるグローバルbowerインストールの必要性、それでWebプロジェクトと
  • ベイグラントマシンpackage.json:
{ 
    "name": "gadada", 
    "version": "1.0.0", 
    "main": "index.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "me", 
    "dependencies": { 
    "bower": "latest", 
    }, 
    "devDependencies": { 
    } 
} 

私はきちんとウェブでこれらのモジュールをインストールすることはできませんので、ディレクトリには、同期されたフォルダとnpmに関する既知の問題があるため、それらをグローバルにインストールしたいと考えています。 唯一のWebアプリケーション専用の仮想マシンであるため、害はありません。

だから私はない:私はそれをインストールNPMの間にリンクされていませんでしたので、動作していないbowerを、使用しようと

その後

sudo npm install -g

私は私が間違っているのは何 sudo npm install -g [email protected]

を行う場合には、正常に動作しますか?

答えて

1

これは、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.jsonscriptsセクションに必要なコマンドを含めることが示唆:私はそれについての素晴らしいチュートリアルを見つけましたが、原因プライベートブラウジングにそれを失いました:いいえ、何が、まったくの道が見当たりません、これを考えてみてください。 npm run bowerのスクリプトからコマンドを実行すると、npmに$ PATHの.binフォルダが含まれているため、バイナリが見つかるようになります。 最高の魔法:

私は同じ問題を抱えている人を助けることができたらいいと思っています:)

0

package.jsonに依存関係をグローバルにインストールしようとしている場合は、それはどのように動作しないのですか?npm install -g ... package.jsonは、特にローカルにインストールされたパッケージを定義するためにのみ使用されます。これは、プロジェクトに沿って乗ることができる必要なモジュールのマニフェストで、プロジェクト全体のサイズをより小さくすることができます(つまり、node_modulesをレポなどに含める必要はありません)。

フラグ-gフラグは、個別にインストールされたグローバルパッケージ(通常はコマンドラインユーティリティなど)用です。プロジェクトのすべてのモジュールがグローバルにインストールされていれば、あなたの状況は本当に深刻な問題にはなりませんが、それ以外の場合は悪いことになります。

何も間違っているわけではありません。インストールにnpmがどのように機能するかは分かりません。

しかし、npmスクリプトを使用して、基本的に-gインストールを実行するプリインストールまたはインストール後のステップを定義することができます。これは余分な作業ですが、プロジェクトを所有していて、これをやっているとすれば、物事を自動化するうまい方法かもしれません。

関連する問題