npmを使用して現在のディレクトリにpackage.json依存関係をインストールする方法


202

私はfooappというWebアプリを持っています。私はpackage.json根を持っています。すべての依存関係を特定のにインストールしたいnode_modules directory。どうすればよいですか?

私が欲しいもの

2つのwidget依存関係があるとしましょう。私はこのようなディレクトリ構造になりたいです:

node_modules/
  widgetA
  widgetB
fooapp/
  package.js
  lib
  ..

私が得るもの

私が実行するnpm install fooapp/ と、これが得られます:

node_modules/
  fooapp/
    node_modules/
      widgetA
      widgetB
    package.js
    lib/
    ..
fooapp/
  package.js
  lib/
  ..

npmは、アプリディレクトリのコピーをnode_modulesディレクトリに作成し、パッケージを別の node_modulesディレクトリにインストールします。

これはパッケージのインストールに意味があると理解しています。しかし、私はrequire()自分のWebアプリを他のものの中に入れず、直接実行します。依存関係を特定のnode_modulesディレクトリにインストールする簡単な方法を探しています。

回答:


389

ランニング:

npm install

ここで説明するように、アプリディレクトリ内(つまり、package.jsonがある場所)から、モジュールとしてインストールするのではなく、アプリの依存関係インストールします。これらは、package.jsonファイルに相対的な./node_modulesに配置されます(実際にはこれよりも少し複雑なので、npmのドキュメントをここで確認してください)。

ノードの 'require'メカニズムがこれを理解するため、必要に応じて、node_modulesディレクトリをアプリの親ディレクトリに自由に移動できます。ただし、インストール/更新でアプリの依存関係を更新する場合、npmは再配置された「node_modules」を認識せず、代わりに、package.jsonに関連する新しいディレクトリを作成します。

これを防ぐには、再配置されたnode_modulesへのシンボリックリンクをアプリディレクトリから作成します。

ln -s ../node_modules node_modules

素晴らしい!私はそれを試してみて、それが機能する場合は受け入れられたものとしてマークします。
Daniel Beardsley

9
それが実用的な解決策であるにもかかわらず、npm link別のディレクトリからモジュールを取得する必要があるような状況では、より便利であることがわかりました(stackoverflow.com/a/14387210/820520を参照)
melekes 14

14

私の場合、私はする必要があります

sudo npm install  

私のプロジェクトは/ var / www内にあるので、適切な権限も設定する必要があります。


15
npmのインストールにはsudoは必要ない場合があります。
Allen Koo

2
jsファイルを実行する必要があるユーザーとインストールされている依存関係に応じて、を実行できますsudo -u [username] npm install。ただへのより良いnpm installchownnode_modulesディレクトリを再帰的事実の後に。
TheLonelyGhost 14

5
使用している場合を除いて、spmでnpmを実行しないでください。-gそれでも、それを処理するためのより良い方法があります。
tkone 2015

1
回答ありがとうございますが、なぜですか?説明できますか?つまり、ルート権限を持つフォルダを保持し、-gなしで依存関係をインストールする必要があるプロジェクトがある場合はどうなりますか?多分正当な理由があるかもしれませんが、私はsudo npm install(-gなし)を数回実行しましたが、何の問題もありませんでした。乾杯!
aesede

1
@RredCatこの種のものを実行する正しい方法については同意しますが、しばらくして、この議論がUbuntuに移行していることに気づき、一部の権限とフォルダーを管理する方法に問題があるようです。sudo npm。繰り返しますが、Ubuntuでのみです。
aesede

0

実行するだけ

sudo npm i --save

それで全部です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.