問題タブ [npm-shrinkwrap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
npm - シュリンクラップ、npm-lockdown、または npm-seal をいつ使用するか
私はcomposer
. 私はgulp
(など)ビルドプロセスに取り掛かり、学習node
と使用方法を進めてnpm
います。
のようなマニフェストがデフォルトで含まれていないのは非常に奇妙です (これもcomposer
バックグラウンドから来ています)。composer.lock
そうは言っても、[shrinkwrap]、[npm-lockdown]、および [npm-seal] に関するドキュメントを読んでいます。...そして、ドキュメントを読めば読むほど、どちらを選択すべきか混乱します (誰もが自分のやり方が最善の方法だと考えています)。私が気付いた問題の 1 つは、npm-seal
4 年とnpm-lockdown
8 か月間変更されていないことnpm
です。
- それぞれの利点/欠点は何ですか?
- プロジェクト A では別のものを使用し、プロジェクト B では別のものを使用するのはどのような場合ですか?
- それぞれが開発ワークフローにどのように影響しますか?
PS: それぞれの最も基本的な実装例を含めれば、Brownie は指摘します。;)
node.js - 同じサーバー上の複数のワークスペースに共有 npm node_modules/ を使用する
私たちの Jenkins/CI サーバーは、node/js プロジェクトのために 1 日に何百ものビルドを実行します。完全にクリーンなワークスペースで各ビルドを実行できるようにしたいと考えています。ただし、このnpm install
ステップには 10 分以上かかる場合があり、これは遅すぎます。npm install
代わりに、npm の依存関係は少数のビルド (全ビルドの約 1%) でのみ変更されるため、変更のたびに 1 回だけ実行したいと思いnpm-shrinkwrap.json
ます (ビルドごとに md5sum を確認してください)。シュリンクラップ ファイルが変更されていない場合は、キャッシュされたnode_modules/
ディレクトリを使用します。
この計画は、キャッシュされた をコピーすれば十分に機能しますnode_modules/
が、その操作でも最大 1 分かかる場合があります。ビルド時間をさらに最適化するために、 cached にシンボリック リンクできるようにしたいと考えていnode_modules/
ます。これにより、全体的なビルド パフォーマンスが大幅に向上するはずです。
ただし、依存関係ツリーの複数のレベルに依存関係が存在する場合、キャッシュのパスへの単純なシンボリック リンクは機能しません。gulp
例として、最上位プロジェクトは と の両方に依存していgulp-util
ます。最上位の依存関係も に依存しgulp-util
ます。の後、npm install
はgulp-util
最上位にインストールされますが、 にはインストールされnode_modules/
ませんnode_modules/gulp/node_modules
。
依存関係がローカル ワークスペース (つまり、実際のディレクトリ) に存在する場合、適切なモジュールが見つかるまで、inside/path/to/workspace/node_modules/
のインスタンスは (私が思うに) 依存関係ツリーを再帰します。つまり、 を探し始めて何も見つからず、次に を調べ、適切なモジュールを見つけ、それをインポートして先に進みます。require('gulp-util')
node_modules/gulp
gulp-util
/path/to/workspace/node_modules/gulp/node_modules/gulp-util
/path/to/workspace/node_modules/gulp-util
ただし、これがシンボリック リンクの場合、次のようなエラーが発生します。
これは他のバージョンと同じことをしようとしていると思いますが、なぜ見つからないのかわかりませんgulp-util
。で検索して/path/to/workspace/node_modules/gulp-util
も/path/to/cache/gulp-util
、モジュールを見つけてインポートできるはずです。
モジュールを手動でインストールしてこれを解決しようとしましたgulp/node_modules/gulp-util
が、このようなエラーが多数発生し、ビルド サーバーでこれを手動で処理することは不可能です。このタイプの依存関係を検索してインストールするコードを書くことは可能ですが、それは間違っているように感じます。
npm には、そのようなワークフローをサポートする何らかの方法が必要ですよね? 明らかな何かが欠けていますか?ドキュメンテーションで何かを詳しく説明しましたか?
node.js - npmでどの依存関係が導入されているかを確認するには?
package.json
アプリのすべての直接的な依存関係を一覧表示します。whilenpm-shrinkwrap.json
はすべての依存関係を非常にフラットな形式でリストします (可能な限り、子の依存関係をルートの依存関係として配置するようです (?))
これらの依存関係を見て、どれがどれを導入したかを知りたいので、多くの重要でない依存関係を引きずっているいくつかの重要でない依存関係を削除できる可能性があります。
どうやってするか?
json - カスタム ファイルシステム ディレクトリから npm パッケージをオフラインで透過的にインストールする
編集者注: 質問の元のタイトルは「npm install を使用して、ローカル ディレクトリに保存されているノード モジュールをインストールする」でした。したがって、一部の既存の回答では、インストール プロセスの変更に基づくソリューションが提案されています。
これは簡単なことだとは思いますが、私はこの分野のことはまったく初めてなので、探し回って、本当に欲しいものではない答えを常に見つけた後、直接尋ねてみようと思いました。
現在、npm install を呼び出すディレクトリ FOO で実行されるプロセスがあります。ディレクトリ FOO には、package.json と npm-shrinkwrap.json ファイルが含まれており、モジュール (この場合は bluebird、extend、および mysql ですが、実際には関係ありません) とバージョンを指定します。これはすべて完全に正常に機能します。
しかし今は、インターネットにアクセスしてモジュールを取得する代わりに、モジュールをローカル ディレクトリ BAR に保存し、foo のプロセスで npm を使用してそこからモジュールをインストールしたいと考えています。それらを FOO に永続的に保存することはできませんが、制御できない理由で BAR に保存することはできます。これが比較的単純であることはわかっていますが、適切なコマンドのセットを取得できないようです。助けてくれてありがとう。
node.js - 「npm link」で作成されたシンボリックリンクノードモジュールをシュリンクラップするには?
一度に 2 つのリポジトリで作業します。一方は他方に依存します (package.json
依存関係にリストされています)。
そのため、両方のモジュールで同時に作業するためにnpm link ..\theOne
inを使用しています。other
その結果、あるモジュールの変更を別のモジュールでテストできます。問題は、npm shrinkwrap
このother
モジュールで実行する場合です。次のようなエラーが生成されます。
npm ERR! extraneous C:\other\node_modules\theOne\node_modules\{xxxx}
{xxxx}
npm には関係のないものとして表示される開発依存関係です。
モジュールを別のモジュールへのシンボリックリンクでシュリンクラップすることに成功した人はいますか?
注意:
- npm 3.10.3
- ノード 6.3.0
node.js - カスタムの依存関係を持つ node.js プロジェクトを出荷する
node.js プロジェクトのネストされた依存関係の問題をいくつか修正しました (依存関係は npm によって管理されます)。これらの修正は保留中のプル リクエストであるため、公開されていません。私のプロジェクトでそれらを使用する最良の方法は何ですか?
npm link
ライブラリの固定バージョン内で、次にnpm link library-name
プロジェクト内で、npm に固定バージョンを強制的に使用させることができることを知っています。library-name
このアプローチは機能しますが、好きではないマシンにグローバルにインストールされます。
メインプロジェクトのリポジトリでローカルに使用することは可能ですか?プロジェクトに強制的に使用させ、実行しないでくださいnpm link
。
npm - npm Shrinkwrap には localhost へのパスが含まれています
実行後npm shrinkwrap
、localhost への参照が多数あることがわかりました。
これらの参照は未加工の node_modules にもあることがわかります。
したがって、これは、インストール時に多くのフェッチおよび再試行エラーが発生していることを意味します。
これは正しくありません。これを修正する最善の方法は何ですか?