9

私のpackage.jsonには依存関係があり"protractor": "2.1.0"ます。そのパッケージは、次に依存し"jasminewd2": "0.0.5"ます。

そのjasminewd2パッケージには、変更したい動作がいくつかあります。そのソースをダウンロードし、必要な変更を加えました。Yarn のドキュメントでは、パッケージにローカル ソースを使用する可能性について説明しています。

yarn add file:/path/to/local/folderローカル ファイル システムにあるパッケージをインストールします。これは、レジストリに公開されていない他のパッケージをテストするのに役立ちます。

そのコマンドを実行すると

  1. "jasminewd2": "file:\\CustomNodeModules\\jasminewd2"私のpackage.jsonに追加されます。
  2. そして、これを私のyarn.lockファイルに:

    "file:\\CustomNodeModules\\jasminewd2", jasminewd2@0.0.5:
      name jasminewd2
      version "0.0.5"
      resolved "https://registry.yarnpkg.com/jasminewd2
         /-/jasminewd2-0.0.5.tgz#528609a124dfc688c1e3f434a638e047066cd63e"
    

その結果、node_modules/jasminewd2npm リポジトリの元のバージョンが含まれます。代わりに糸に自分のバージョンをインストールさせるにはどうすればよいですか?

4

2 に答える 2

7

jasminewd2は推移的な依存関係 (のprotractor) であり、直接的な依存関係ではないため、ソリューションが機能しないと思います。したがって、直接追加しても、推移的なものは影響を受けません。

次の 3 つの方法で回避できます。

  1. 変更が一時的なもの (開発またはトラブルシューティングを目的としたもの) である場合は、ドキュメントyarn linkの説明に従ってください。
  2. protractorそれ以外の場合は、とjasminewd2パッケージの両方をフォークして、それぞれpackage.jsonの で参照できます。package.jsonその 構文"protractor": "<githubUser>/<githubRepo>".
  3. yarnresolutions フィールドを使用: "resolutions": { "jasminewd2": "desired-version-or-url-or-path" }. PNPM にも同等の機能があることは知っています (ただし、自分で使用したことはありません)。

私の経験から、オプション 2 と 3 には、パッケージ マネージャー キャッシュの形で警告があります。git リポジトリは、その依存関係が最初にインストールされHEADたときにのみプルされます。その後、リポジトリが変更された場合でも、毎回キャッシュされて再インストールされます。HEAD

回避策は、次のようにコミット ハッシュを依存関係の一部として参照することです"dependency": "user/repo.git#aef38fb2adc73304ae1ea87b0d607ad7fadc4d0g"

于 2016-11-04T07:34:37.153 に答える
2

postinstall と git を使用してサブモジュールをオーバーライドする

npm の方法」では、git リポジトリからパッケージをインストールするために特定のコミット (またはバージョン/タグ) が必要です。 npm install に関する詳細情報。私は通常、カスタム ブランチを作成してそれをプッシュするので、特定の機能をテストするため、または master をそのままにしておくために、カスタム ブランチを複製できるようにしたいと考えました。

パッケージをオーバーライドするには、npmのpostinstall フックフックを使用します。

にスクリプトを追加しpostinstallますpackage.json

"scripts": {
  "postinstall": "./postinstall.sh",
  "start": "node index.js"
},

postinstall.sh次に、パッケージを削除して github から複製するために bash スクリプト ( ) を使用します。

#!/bin/sh

function override_pkg {
  USER=$1
  REPO=$2
  DEST=$3

  rm -rf node_modules/$DEST

  echo "Overriding $DEST..."

  if [ -d custom_modules/$DEST ]; then
    cd custom_modules/$DEST
    git pull
    cd ../../
  else
    case $REPO in
      *:*)
      REPOBR=(${REPO//:/ })
      git clone -b ${REPOBR[1]} https://github.com/$USER/${REPOBR[0]}.git custom_modules/$DEST
      ;;
      *)
      git clone https://github.com/$USER/$REPO.git custom_modules/$DEST
      ;;
    esac
  fi

  npm install custom_modules/$DEST
}

# func       user    repo   branch dest
override_pkg johndoe myrepo:branch mynpmpackage

スクリプトは、custom_modulesフォルダー内のパッケージを複製しnpm、ローカル パッケージを にインストールするために使用しますnode_modules。後のブランチ名:はオプションです。

OPの場合、次のようになります。

override_pkg johndoe jasminewd:jasminewd2 jasminewd2

次に糸:

yarn

ローカルの git リポジトリでローカルな変更を行う場合は、パッケージの再オーバーライドを再度custom_modules\mypackage呼び出します。yarn

マシンを変更し、カスタム パッケージのローカル バージョンを既に取得している場合、呼び出しyarnによってリポジトリから取得され、パッケージが上書きされます。

PS。npm installも動作しますyarnが、少し高速です。

テスト用の複数の環境

これは別のアイデアですが、さまざまな構成をテストするために使用することもありました。誰かがこれを行うためのツールや何かを知っている場合は、私に教えてください。

node_modulesローカルで、次のような2 つの異なるフォルダーを作成します。

最初に元のモジュール:

yarn --modules-folder=original-modules

フラグ:

  • --modules-folder <path>node_modulescwd に関連するフォルダーにモジュールをインストールするのではなく、ここに出力します。

次に、カスタムのものoriginal-modulesについては、クローンをコピーするだけです。

cp -r original-modules custom-modules

または、yarn を使用してカスタム モジュールを追加することもできます。

yarn add <modulename> --no-lockfile --modules-folder=custom-modules

フラグ:

  • --no-lockfileロックファイルを読み取ったり生成したりしないでください

フォルダーに満足したら、NODE_PATHcustom-modulesを使用して次のような環境を切り替えることができます。

通常の環境の場合:

NODE_PATH=original-modules npm start

カスタム環境:

NODE_PATH=custom-modules npm start

node_modulesフォルダーが存在しないか、オーバーライドが機能しないことが重要です。ローカルnode_modulesフォルダーの優先度は よりも高くなりますNODE_PATH

于 2016-11-11T18:46:29.773 に答える