ローカルモジュールをnpmパッケージの依存関係として指定する方法


269

私は、依存関係の下のpackage.jsonファイルで指定されたサードパーティモジュール(たとえば、「エクスプレス」)への通常の依存関係のセットを持つアプリケーションを持っています。例えば

"express"     : "3.1.1"

私は自分のコードをモジュール化して構造化し、ローカル(現在使用しているファイルシステム上)モジュールのセットをpackage.jsonによってインストールしたいと考えています。次のコマンドを実行して、ローカルモジュールをインストールできることを知っています。

npm install path/to/mymodule

ただし、package.json依存関係構造を介してこれを行う方法はわかりません。--saveこのコマンドでオプションを使用することは、単に"mymodule": "0.0.0"package.jsonに入れることです(ファイルパスの場所を参照しません)。インストールされているバージョンをnode_modulesから削除し、package.jsonから再インストールしようとすると、失敗します(中央レジストリで「mymodule」を検索し、ローカルでは検索しないため)。

これは"dependencies": {}、ファイルシステムパスからインストールするように構造に指示する方法だと思いますが、方法がわかりません。

他の誰かがこの問題を抱えていましたか?ありがとう。


1
本当に良い質問です。以下のための機能と同等が存在しないことを認識することが悲しいpackage.json私たちが持っているものにGemfile秒。
Jarl

回答:


407

npm install 今これをサポートしています

npm install --save ../path/to/mymodule

これを機能mymoduleさせるには、独自のモジュールとして構成する必要がありますpackage.jsonNodeJSモジュールの作成を参照してください。

npm 2.0以降、ローカルの依存関係はネイティブでサポートされています。同様の質問に対するdanilopopeyeの回答を参照してください。この質問はウェブ検索結果で非常に高くランク付けされているため、ここに彼の回答をコピーしました。

この機能は、npmのバージョン2.0.0で実装されました。例えば:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

次のパスも有効です。

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

更新の同期

npm installコピーmymoduleされるためnode_modulesmymoduleのソースの変更は、依存するプロジェクトによって自動的には表示されません。

依存プロジェクトを更新するには2つの方法があります

  • のバージョンを更新してmymoduleから使用してくださいnpm update:上記のように、package.json「依存関係」エントリには、通常の依存関係のようにバージョン指定子が含まれていません。代わりに、ローカルの依存関係のため、npm update念のためにしようと、最新によって決定されるように、バージョンがインストールされているmymodulepackage.jsonこの特定の問題に対するchriskellyの回答を参照してください。

  • を使用して再インストールしnpm installます。これによりmymodule、が古い場合や、代替ブランチがチェックアウトされている場合でも、のソースパスにあるものがインストールされます。


2
これでうまくいきました。(私はちょうどローカルの相対パスを次のように実行しました"mymodule":"file:mymoduledir"
Don Rhummy

72
npm install --save ../my-local-repo
Ivan Rave 2017年

15
そして、それをプロジェクトでどのように使用しますか?のように呼び出そうとしていますがimport { HelloWorld } from "my-test-lib";、「Cant find module」エラーが表示されます。stackoverflow.com/questions/46818083/…を
Vitalii Vasylenko

6
@LucioMollinedoは、ローカルモジュールをインポートする方法の構文を共有できますか?Vitalliiと同様に、「Ca n't fine module」エラーが発生しますimport { HelloWorld } from "my-test-lib";
Stan James

7
これは、依存関係がプロジェクトにインストールされないため、パッケージの参照と同じようには機能しません
Glass Cannon

44

参照:package.jsonのローカル依存関係

答えは次のようですnpm linkhttps : //docs.npmjs.com/cli/link


5
実際にnpmリンクはシンボリックリンクを作成するだけで、package.jsonを変更してローカルの依存関係を追加しません
Sebastien H.

1
しかし、そうでない場合symlink、依存関係の構築が完了したら、親プロジェクトはどのようにして再構築を知るのでしょうか?
Jamie Hutber

11

私は最後にきちんとした方法を見つけることができなかったので、というディレクトリを作成して、local_modulesこのbashscriptを、scripts-> preinstallのpackage.jsonに追加しました。

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done

5

npm linkコマンド(ローカルモジュールをレジストリに公開したり、node_modulesフォルダーに個別のコピーを維持したりせずにローカルモジュールを開発するための推奨ソリューション)にかなり苦労した後、この問題を解決するために小さなnpmモジュールを構築しました。

修正には2つの簡単な手順が必要です

最初:

npm install lib-manager --save-dev

次に、これをあなたに追加しますpackage.json

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

詳細については、https://www.npmjs.com/package/lib-managerをご覧ください。それが誰かを助けることを願っています。


0

node_modulesにプリインストールされているモジュールを他のファイルと一緒に公開するだけでよい場合は、次のように実行できます。

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

モジュールをgitに保存し、親のpackage.jsonにgitからの依存関係をインストールするように指示することもできます:https : //npmjs.org/doc/json.html#Git-URLs-as-Dependencies


5
残念ながら、これには、同じディレクトリーのレジストリー(例えば、接続)からローカル・モジュールとサード・パーティー/コントリビュートされたモジュールがインストールされたnode_modulesが関係します。Git / VCSの観点から混乱することに加えて(つまり、私が作成したものを除き、node_modules内のすべてを無視する必要があります)、それも悪い習慣です(私が書いて公開されていないものは、他の人が書いて公開したものとは別に保管する必要があります) )。
サムアダムス

ローカルモジュールを追加してから変更を加えると、これらはメインアプリに表示されません。これはなぜですか?
Mark Tyers 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.