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


453

私は、このような何かをしたいnpm installまた、インストールpackage.json../somelocallibその依存関係や、より重要な。

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}

回答:


582

npm> = 2.0.0

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

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

次のパスも有効です。

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

ローカルパッケージはプレフィックスにコピーさます./node-modules)にます。

npm <2.0.0

通常somelocallibどおりに依存関係を入れますpackage.json

"dependencies": {
  "somelocallib": "0.0.x"
}

次にnpm link ../somelocallib、npmを実行すると、作業中のバージョンがシンボリックリンクとしてインストールさます。

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

リファレンス:link(1)


3
リンクを解除するにはどうすればよいですか?
AtaurRehman Asad 14年

13
「npmリンク」を使用してローカルパッケージをインストールすることの欠点は、モジュールが大量に重複することです。依存関係を「モジュール:バージョン」または「モジュール:git-repo」で一覧表示すると、npmインストールアルゴリズムは、親パッケージにすでにインストールされているパッケージのインストールを回避します。したがって、「npm link」を使用すると、メインアプリケーションが「async@0.8.0」に依存し、すべてのローカルパッケージも「async@0.8.0」に依存する場合、「async@0.8」をインストールするすべてのローカルパッケージで終了します。メインアプリケーションの同じインストール済み「非同期」バージョンを使用する代わりに0。これは「npmインストールフォルダー」を使用して発生しません。
ペドロバレステロス2014年

3
@PedroBallesterosを使用して、npm dedupこの問題を修正できます。npmjs.org/doc/cli/npm-dedupe.html
danilopopeye

4
「ローカルパッケージがコピーされます...」は、より新しいnpmバージョンでは当てはまらないようです。これで、シンボリックリンクが作成されました。
tsauerwein

2
@ danilopopeye docs.npmjs.com/cli/installの npm install <folder>説明によると、ディレクトリにパッケージを現在のプロジェクトのシンボリックリンクとしてインストールします。
Herman J. Radtke III

211

ローカルノードモジュールのインストールパスをpackage.json直接指定できるようになりました。ドキュメントから:

ローカルパス

バージョン2.0.0以降では、パッケージを含むローカルディレクトリへのパスを提供できます。ローカルパスは、npm install -Sまたはnpm install --saveを使用して、次のいずれかの形式で保存できます。

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

その場合、それらは相対パスに正規化され、に追加されますpackage.json。例えば:

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

この機能は、ローカルオフライン開発や、外部サーバーにアクセスしたくない場所にnpmのインストールを必要とするテストの作成に役立ちますが、パッケージをパブリックレジストリに公開する場合は使用しないでください。


23
npm v.3 +では、正規化は絶対ではなく相対であるため、次のようになります"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
バージョンをインクリメントせずにローカルパスの依存関係を更新する方法は?
Bohdan Lyzanets 16

3
ちなみに、標準のnode:onbuildイメージは現在のディレクトリのみをコピーするため、ノードアプリケーションをドッキングしようとすると、あらゆる問題が発生し../fooます。
donmartin '13年

4
これをgit + sshと統合npm installして、LAN上のgitリポジトリのローカルコピーまたは別のgitリポジトリを持つことができる方法はありますか?上記を試してgit + sshからnpmをインストールすると、node_modulesディレクトリを調べて、git + sshを超えようとしないように見えます。これは、トップレベルのパッケージをインストールする方法です。
マイケル

1
インストール作業。しかし、この方法でモジュールをプロジェクトにインポートしようとすると、「ERR not found」が表示されます。
C4d

87

これでうまくいきます。

以下をpackage.jsonファイルに入れます

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

4
「npmリンク」の使用を必要としない提案をありがとう
ItalyPaleAle

これ.gitignoreはモジュールフォルダーから削除されて作成され.npmignore、初めて実行したときにを除くすべてのフォルダーに777を再帰的に適用しましたnode_modules。しかし、はい、依存関係をインストールしました。npmバージョン1.4.14の使用。
L0LN1NJ4 2014

これを使用しましたが、node_modulesをいじる代わりに、app_modulesを使用しました
catalint

1
なんで "dependencies": { "my-own-module": "file:../my-own-module" }
Bohdan Lyzanets 16

1
ここで@Bohdanに同意します。localdependenciesはまったく同じことを行います。を使用する利点は、依存関係を最新にするために毎回npm link行う必要がないことですnpm install
froginvasion

30

モジュールをバージョン管理にチェックインし、開発者がnpmリンクを覚えていることに依存したくないため、これをさらに自動化する場合は、package.jsonの「scripts」セクションにこれを追加できます。

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

これはハックを超えているように感じますが、「機能する」ようです。このnpmの問題からヒントを得ました:https : //github.com/npm/npm/issues/1558#issuecomment-12444454


15
なぜpostinstallそしてpostupdate代わりにpreinstallそしてpreupdate
2014

1
これが何をするかをもう少し説明していただけませんか。つまり、vscodeプロジェクトを複数のルートフォルダー(つまり、「マルチルートワークスペース」)でセットアップした場合、使用中のプロジェクトのモジュールフォルダーの変更をすぐに反映できますか?-それがこのハックの目的ですか?
bvdb 2019年

26

これは、ローカル依存関係を追加する方法です。

npm install file:src/assets/js/FILE_NAME

NPMからpackage.jsonに追加します。

npm install --save file:src/assets/js/FILE_NAME

このように直接package.jsonに追加します:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....

6

マスタープロジェクト

マスタープロジェクトに使用するpackage.jsonは次のとおりです。

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

そこに./somelocallib、マスタープロジェクトpackage.jsonに関連するライブラリフォルダーへの参照があります。

リファレンス:https : //docs.npmjs.com/files/package.json#local-paths


サブプロジェクト

ライブラリの依存関係を処理します。

を実行npm installすることに加えて、実行する必要があります(cd node_modules/somelocallib && npm install)

これはNPMの既知のバグです。

参照:https : //github.com/npm/npm/issues/1341(より最新の参照を求める)


Dockerに関する注意

マスターpackage.lockとチェックインsomelocallib/package.lockし、ソースコードマネージャーに。

次に、Dockerfileで次を使用します。

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

(cd A && B)操作でべき等にするために、コンストラクトで括弧を使用しています。


3

私はそれがnpm install ../somelocallibうまくいくことを知っています。

ただし、質問で示した構文が機能するかどうかはわかりませんpackage.json...

残念ながら、ドキュメントには依存関係としてURLのみが記載されているようです。

試しfile:///.../...tar.gzて、zipされたローカルlibをポイントして、動作するかどうかを教えてください。


1
"dependencies":{"somemodule": "file:///./internal_modules/somemodule"}をpackage.jsonに追加します。動作しません。エラーコードは「npm ERR!コードE404」です。
Jeffrey

2

これは私にとってうまくいきました:最初に、npmディレクトリに適切なユーザーがいることを確認してください

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

次に、package.jsonでディレクトリをリンクします

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

2
XP en.wikipedia.org/wiki/NTFS_symbolic_linkから、Windows上のシンボリックリンクが可能になりました。管理者としてコマンドラインを開き、を実行しnpm installます。
sod 2014年

2

実際、npm 2.0以降、ローカルパスがサポートされるようになりました(こちらを参照)。


8
Michael Trouwは、数週間前にこの回答を既に与えているので、なぜ重複するのですか?
Dan Dascalescu 16年

2

好奇心が強い.....少なくともWindowsでは(私のnpmは3.何か)私がする必要がありました:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

私がnpm install ../module1 --saveそれをしたとき、絶対パスになり、ドキュメントごとの相対パスにはなりませんでした。

私はもう少しいじって、それで../xxx十分だと判断しました。

具体的には、d:\ build \ module1、d:\ build \ module2などのローカルノードモジュールと、d:\ build \ nodeAppにあるノードプロジェクト(アプリケーション)をチェックアウトしています。

「インストールするには」、私は:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

module1のpackage.jsonには「module2」の依存関係があります:「../module2」; module2にはローカル依存関係はありません。nodeAppには、「module1」:「../module1」および「module2」:「../module2」という依存関係があります。

3つのフォルダー(module1、module2、nodeApp)がすべて同じレベルにあるため、これが私だけで機能するかどうかはわかりません。


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