7

npm のドキュメントには次のように書かれています。

  • プログラムで使用したいものをインストールする場合は、require('whatever') を使用して、プロジェクトのルートにローカルにインストールします。
  • シェルやコマンドラインなどで使用したいものをインストールする場合は、グローバルにインストールして、そのバイナリが PATH 環境変数に配置されるようにします。

私は現在、シェルから使用することを意図したノードの本物のコマンドラインプログラムを書いています---または、少なくとも、書き込もうとしています---。したがって、上記によると、私の依存関係はグローバルモジュールとしてインストールする必要があります。

npm でインストールされたグローバル モジュールをノードで実際に使用するにはどうすればよいですか? require()もちろん、npm グローバル モジュール ディレクトリ ( /usr/local/lib/node_modules) はデフォルトではパス上にないため、呼び出しは機能しません。プログラムの先頭のパスに明示的に追加することで機能させることができますが、移植性がないため、これは本当にお粗末な解決策です.npmのグローバルモジュールディレクトリが特定のシステムのどこにあるかを知る必要があります。

生活をさらに悪化させるために、dpkg を介していくつかのグローバル モジュールをインストールしています。これらは に入れられ/usr/lib/nodejs、機能します。これは私を混乱させます。なぜなら、グローバル モジュールが通常のアプリケーションに使用されることが想定されていない場合、どちらもパス上にないことを期待するからです。そうでなければ、両方がパス上にあり、グローバルモジュールがどこでも機能することを必要とする. 一方を持っていてもう一方を持っていないのは非常に奇妙に思えます。何が起きてる?

更新:このプログラムは単なるスクリプトであることを指摘しておく必要があり#!/usr/bin/env nodejsます。これは正式なノード モジュールではありません。Debian モジュールはすべてそのようなスクリプトから必要とされるため、npm のグローバル モジュールも必要とされることは理にかなっているように思えますが、これは Debianism であると感じています...

4

3 に答える 3

4

したがって、上記によれば、依存関係はグローバルモジュールとしてインストールする必要があります。

完全ではありません。

これは、モジュールをグローバルとしてインストールできるため、そのバイナリをシェルから利用できることを意味します。

npm install -g your-module
your-module-binary --option etc.

一方、その依存関係は、node_modulesプロジェクト内のディレクトリにある最初のポイントの後にインストールする必要があります(通常はで指定されているpackage.jsonため、npmそれらを管理できます)。

ただし、グローバルモジュールは(通常)では使用できませんrequire。それらは、ローカルモジュールの後に続くフォルダからの読み込みにnode_modulesは従いません。また、それらのパスは通常、グローバルフォルダからの読み込みの変数にリストされていません。npmNODE_PATH

于 2012-09-25T16:18:59.997 に答える
1

したがって、指示は npm モジュールに関連していますが、ローカル開発を行っています。ここにいくつかのガイドラインがあります。

requireソース コードに関しては、2 種類のステートメントのみが必要です。

var dep = require('somedep')

これは、コア モジュール ( などfs) と、npm を介してライブラリに含める必要があるサード パーティ モジュールに使用します (package.json に依存関係としてリストします)。ここで非修飾パッケージ名を指定すると、node はその検索アルゴリズムに従ってモジュールを見つけます。

var mymod = require('./lib/mymod')

これを使用して、プロジェクト自体の他のモジュールを、現在の JavaScript ファイルに対する相対パスで要求します。

JavaScript の依存関係を処理するために必要な作業はこれだけです。

さて、依存関係をどのようにインストールしますか?

ローカル開発 (プロジェクトのソース ツリー内) の場合は、プロジェクト ディレクトリに移動して を実行するだけですnpm install。これにより、ファイルが読み取らpackage.jsonれ、必要なモジュールがnode_modulesサブディレクトリにインストールされます。すべてローカル開発に適しています。

実際にこれを npm モジュールとして公開する場合、他のユーザー (開発者と「他のユーザー」の 1 人の両方になることができます) は、必要なプロジェクトのバイナリ ユーティリティにアクセスしたい場合に、それをインストールできますnpm -gPATHを含めます/usr/lib/nodejs/lib/node_modulesが、その場合、 はnpm -gコードとプロジェクトの依存関係の両方を一度にインストールします。

ここがあなたが混乱しているところです。

したがって、上記によると、私の依存関係はグローバルモジュールとしてインストールする必要があります。

依存関係をグローバルとして明示的にインストールする必要はありません。関心のある最上位モジュールのみをインストールします。この場合はプロジェクト自体です。npm は依存関係を自動的に処理します。これが主な目的です。プロジェクトの依存関係は、グローバルにインストールされるのではなく、グローバルにインストールされるnode_modulesプロジェクトのサブディレクトリにインストールされます。

ディレクトリとそこにあるものは次のとおりです。

  • ~/yourproject: ソース コードのローカル開発
  • ~/yourproject/node_modules: 開発中にプロジェクトで使用される npm モジュール。npm installで実行して作成/入力~/yourproject
  • /usr/lib/nodejs/lib/node_modules: グローバルにインストールされている npm モジュール (npm レジストリに発行すると、最終的に yourproject が含まれる可能性があります)
  • /usr/lib/nodejs/lib/node_modules/yourproject/node_modules: 実行すると、プロジェクトの依存関係がここにインストールされますnpm install -g yourproject

また、インタープリターと PATH関連の管理に関する私のブログ投稿を見つけることもできます。

于 2012-09-25T15:40:50.453 に答える