web-dev-qa-db-ja.com

symlinksオプションなしのnpmインストールが機能しない

Windows 8とUbuntuを仮想マシンとして開発環境をセットアップしました。そのために私はVirtualBoxを使用します。

VirtualBoxに共有フォルダーを作成することもできます。

この共有フォルダーで、Yeomanのember-generatorを使用してプロジェクトを開始しようとしています。

yo ember --skip-install --karma
npm install --no-bin-links

モジュールNPMをインストールするには、オプション「--no-bin-links」を使用してシンボリックリンクを作成しません。残念ながら、シンボリックリンクの作成でエラーがまだ発生します...このオプションを使用しているのですか?そこに彼はバグがありますか?

27
Bastien D

NPM docs パラメータ "--no-bin-links"について:

npmがパッケージに含まれている可能性のあるバイナリのシンボリックリンクを作成しないようにします。

これにより、NPMはnode_modules/.binフォルダーにリンクを作成しなくなります。また、npm install ../myPackageを使用するときにNPMがシンボリックリンクを作成しないようにする方法を探しましたが、解決策が見つかりません...

更新:npmサポートチームは、これにより古い動作が再現されると述べました(シンボリックリンクはありません)。

npm install $(npm pack <folder> | tail -1)

Windows 10のgit-bashで動作します。

37
TekTimmy

このスタックオーバーフローページは、ローカルモジュール(つまりnpm install ../myPackage)のインストールの問題を解決しようとして、シンボリックリンクが不要な場合、Googleの検索結果に表示されます。他の人を助けるために、この回答を以下に追加します最終的にここにいる人)

ソリューション#1-開発環境向け。

他の回答作品で述べたように、NPMサポートチームによって提案されたソリューションを使用しています...

# Reproduces the old behavior of hard copies and not symlinks
npm install $(npm pack <folder> | tail -1)

これは、手動インストールの開発環境では問題ありません。

ソリューション#2-ビルド環境用。

ただし、今回のケースでは、Gitへの変更をコミットするときに./node_modules/フォルダーが無視されるため、開発環境はそれほど重要ではありません。

ファイル./package.jsonおよび./package-lock.jsonは重要であり、ビルド環境に取り込まれます。

ビルド環境(自動CI/CDパイプラインの一部)では、オートメーションはnpm installコマンドを実行し、package.jsonファイルにリストされている依存関係からビルドするだけです。

だから、ここで問題が私たちに影響を与えます。 package.jsonの依存関係リストにあるローカル参照ファイルにより、シンボリックリンクが表示されます。これで古い問題に戻りました。これらのシンボリックリンクは、ステージ環境と本番環境に移動するビルドの出力に取り込まれます。

代わりに、シンボリックリンクを元のコピーに変換する--copy-linksオプションを使用して、アーカイブモードでrsyncを使用しています。

自動ビルドでのコマンドは次のようになります。

# Install dependencies based on ./package.json
npm install

# Make a copy that changes symlinks to hard copies
rsync --archive --verbose --copy-links ./node_modules/ ./node_modules_cp/

# Remove and replace
rm -r ./node_modules/
mv ./node_modules_cp/ ./node_modules/
3
Joseph Shih

私も似たような環境です。どうやら、virtualbox(vagrant)の同期では、ファイルの名前変更または移動時に問題が発生します。これは、モジュールの更新時に発生します。コマンドラインでファイルリスト(ls -alhp)を実行し、???ファイルの権限については、virtualboxを再起動します。これにより、権限が有効な値に設定されます。次に、モジュールをインストールするときに--no-bin-linksオプションを使用します。

2
Pieter Coucke