単一のnpmrcファイルで複数のレジストリを構成する方法はありますか


143

これが私の問題です。VPNでのみ機能するプライベートNPMレジストリがあります。VPNから出たときにシームレスに機能するように、フォールバックレジストリhttps://registry.npmjs.orgを用意したいと考えています。

PS現在、私は使用していますnpmrc回避策として.npmrcファイルを切り替えるには良い仕事をして


8
私は実際に同じことを知りたいです。おそらく、最初に私のプライベートレジストリにpingを送信し、それがパブリックレジストリへのフォールバックに失敗した場合(ローカルフォールバックから、プライベートサーバー上の1つのセットアップではありません)または、私のwifi名に基づいてレジストリを切り替えます。
ProLoser

1
私のような失われた魂のために、npmrcの便利なドキュメント
Andreas

回答:


194

ファイル内のスコープパッケージには、複数のレジストリを含めることができ.npmrcます。例えば:

@polymer:registry=<url register A>
registry=http://localhost:4873/

@polymerスコープ内のパッケージはhttps://registry.npmjs.orgから受信されますが、残りはローカルNPMから受信されます。


15
このアドバイスをありがとう。これらのスコープレジストリに認証を追加することは可能ですか?メインレジストリに_authキーが必要だからです。
Bloomca 2016年

3
スコープパッケージとは何ですか?私はこれについて聞いたことがありません。
jcollum 2016年

1
@jcollum、スコープパッケージは、名前空間を介してグループ化(またはスコープ)されたパッケージです。詳細については、docs.npmjs.com / misc / scopeを参照してください。スコーピングを使用して、いくつかのパッケージ(@angularなど)を関連付けることができます。これにより、パッケージ(@ angular / core)がAngularの一部であることが簡単にわかりますが、@ mycompany / mypackageのような会社の場合もあります。
PatS

6
これはスコープパッケージなしで可能ですか?この特定のパッケージを探している場合はこのレジストリに移動し、そうでない場合はそのレジストリに移動するとし
ましょ

2
@PinguinoSod、いいえ、それはまだ(2019年12月の時点で)対象範囲外のパッケージでは不可能です。ソナタイプは私が知っている唯一の解決策です。stackoverflow.com/a/50995915/3281336を
PatS

71

バージョン4.4.1では、パッケージ名を変更できる場合は、以下を使用します。

npm config set @myco:registry http://reg.example.com

@mycoパッケージのスコープはどこですか。

この方法でパッケージをインストールできます:

npm install @myco/my-package

詳細:https : //docs.npmjs.com/misc/scope


スコープ(npm init --scope = myco)を使用してパッケージを初期化し、それを公開することも必要です。
gjegadesh

1
わかりましたが、そのレジストリのフォールバックはどう
ですか

1
私がInvalid package name "@npmjs/": name can only contain URL-friendly characters走るとき私は得ていますnpm i
umutesen

また、名前にはURLに適した文字のみを含めることができます
katwhocodes

このアプローチは私にはきれいに見えます。これをpackage.jsonで行う方法はありますか?
ハリクリシュナガディパティ

19

認証のソリューションも探している人のために、.npmrcファイルに複数の行を含めることができるスコープパッケージソリューションを追加します。

//internal-npm.example.com:8080/:_authToken=xxxxxxxxxxxxxxx
//registry.npmjs.org/:_authToken=yyyyyyyyyy

各行は異なるNPMレジストリを表します


4
コマンドを使用しnpm login --registry=npm.example.comます。ログイン資格情報(authTokens)はユーザーフォルダーの.npmrcファイルに保存されるため、ソースコード(docs.npmjs.com/cli/adduser)に含める必要はありません
magikMaker

基本的に私は自分のlibにプライベートネクサスレジストリを持っていましたが、私のLibにはいくつかの依存関係があり、そこからインストールする必要があります registry.npmjs.org。これは私にとって
うまくいき

17

最善の方法ではありませんが、WindowsでもMacまたはLinuxを使用している場合は、異なるレジストリにエイリアスを設定できます。

##############NPM ALIASES######################
alias npm-default='npm config set registry https://registry.npmjs.org'
alias npm-sinopia='npm config set registry http://localhost:4873/'

2
同様の解決策は、-registryオプションをnpmに渡すエイリアスを設定することです。これは同じ効果がありますが、単一のコマンドに対してのみです。構文はalias npm-sin=npm --registry https://localhost:4873/
PatS '17 / 07/19

11

(npmだけを使用して)数年前にこれを実行することは不可能に思われるため、この問題の解決策は(Sonatypeの)Nexus Repository Managerを使用することです。Nexusは複数のリポジトリをサポートしており、それらを注文したり、プロキシ/キャッシュを使用して速度を向上させたりできます。

無料版と有料版があります。これをサポートする機能については、https//help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registriesで説明されています

関連情報は以下に複製されているため、上記のURL /リンクが機能しなくなった場合でも、情報はまだここにあります。

リポジトリグループは、追加のクライアント側の構成を必要とせずに、リポジトリマネージャーからユーザーにすべてのnpmレジストリリポジトリを公開するための推奨される方法です。リポジトリグループを使用すると、1つのURLで複数のプロキシおよびホストされたリポジトリの集約コンテンツをnpmおよびその他のツールに公開できます。

プライベートnpmレジストリを作成できます

プライベートnpmレジストリを使用して、独自のパッケージやサードパーティのパッケージをアップロードできます。

そして

重複ダウンロードを減らし、開発者とCIサーバーのダウンロード速度を改善するには、https://registry.npmjs.orgでホストされているレジストリをプロキシする必要があります。デフォルトでは、npmはこのレジストリに直接アクセスします。必要な他のレジストリをプロキシすることもできます。

したがって、これを機能させるために行うことの簡単な箇条書きは次のとおりです。

  • Nexusをインストールする

  • ローカル/プライベートリポジトリを作成する(または別のサーバー上のプライベートリポジトリをポイントする)

  • プライベートリポジトリとパブリックリポジトリをリストするGROUPを作成します。

  • 作成した「グループ」を指すように$ HOME / .npmrcファイルを構成します。

  • プライベートnpmパッケージをローカルリポジトリに公開します。

  • これで、ユーザーは1回限りのセットアップを実行できます。

npm config set registry https://nexus/content/groups/GROUP

  • その後、ユーザーはを介してパブリックパッケージとプライベートパッケージの両方をインストールできますnpm install npm install my-private-package npm install lodash any-other-public-package

また、パブリックパッケージとプライベートパッケージの両方を簡単なnpm installコマンドでインストールできます。Nexusは、グループで構成された各リポジトリを検索するパッケージを見つけ、結果を返します。したがって、npmはまだレジストリは1つしかないと考えていますが、カーテンの後ろには複数のリポジトリが使用されています。

重要な注意:コンポーネントを公開するときは、npm publish --registry https://nexus/content/repositories/private-repo my-private-packageコマンドを指定して、パッケージが正しいリポジトリに公開されるようにする必要があります。


.npmrcファイルで両方のレジストリ(自分のアーティファクトのデプロイ用とプルパブリックアーティファクト用)を構成して、npm publishを実行するたびに言及する必要がないようにできますか?アーティファクトをプッシュするために別のnpmリポジトリを使用し、すべてのアーティファクトをプルするために仮想リポジトリを使用しています。.npmrcファイルで両方を構成するのを手伝ってください。
Anshita Singh

1
@AnshitaSingh私はこれを通過しました。公開用に別のリポジトリがある場合(例:のnpm-private代わりにnpm-group)、プロジェクトののregistry-keyをオーバーライドできますpackage.json(詳細はhttps://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagesを参照)。使用してnpm config set registry <url>、あなたは、例えばに設定することができますnpm-group含まれ、npm-registry(転送リポジトリ)とnpm-private(自分のリポジトリ)。ローカルのGitLab CEからアーティファクトを取得するのは複雑すぎるため、このソリューションを使用しました。
イゴール

7

ファイルのregistryエントリには、複数のリポジトリ構文を使用でき.npmrcます。

registry=http://serverA.url/repository-uri/
//serverB.url/repository-uri/
//serverC.url/repository-uri/:_authToken=00000000-0000-0000-0000-0000000000000
//registry.npmjs.org/

それはあなたのnpmが異なるサーバーのパッケージを探すようにするでしょう。


はい、しかしserverAserverBそしてserverC例のリポジトリは、社内ネットワーク、あなたのために文句を言わない仕事からすべてです。自分に適しているかどうかはわかりませんが、適切だと思われる場合は、Nexus Repository Managerを内部リポジトリに展開してみてください。
フェルナンドフェルナンデス

1
この応答によると、二重スラッシュは意味がないため、値なしでキーを設定しているだけです
PinguinoSod

1
実際、npm / iniプロパティファイルリーダーから見る限り、//は値のないキーとして読み取られます。ちなみに、スコープセクションと同様に、セカンダリレジストリサーバーとして保存されます。それらはnpmに入り、npmの内部評価アルゴリズムに従ってレジストリ設定サーバーとして処理されます。
フェルナンドフェルナンデス

1
誰かにこの解決策を試してもらいます。それは機能し、フォールバックリポジトリの設定に役立ちますか?
ルークP.イサック

3

試すことができるいくつかの手順。(職場でのやり方)

  • 2つ(またはそれ以上)のリポジトリソースアドレスでレジストリグループを作成します。1つは内部プライベートで、もう1つは内部のものを優先するnpmjsへのプロキシです。
  • このグループを.npmrcファイルのレジストリにします。このように、npmは常に内部から取得しようとしますが、見つからない場合はプロキシから取得します

お役に立てば幸いです。


6
npmでレジストリグループを作成するにはどうすればよいですか?どういう意味ですか?
Tuupertunut 2016

1
@Tuupertunutレジストリそれを行う最も簡単な方法は、sonatype nexusのような、ある種のリポジトリマネージャーを使用することです。プライベートレジストリをホストしたり、npmjsでプロキシしたり、リポジトリグループを作成したりできます。
Kaus Untwale 2016


1

会社が独自のレジストリを設定したときにも同じ問題が発生するため、この問題を解決するために、proxy-registryproxy-multi-registriesに大幅に変更しました。それがあなたにも役立つことを願っています。


1

2020年4月13日現在、別のスコープを使用できない限り、そのような機能はありませんが、回避策としてpostinstallスクリプトを使用できます。npmがインストールされるたびに、常に実行されます

プライベートgithubリポジトリから@ foo-org / foo-pack-privateをインストールするように.npmrcを構成しているが、@ foo-org / foo-pack-publicパブリックパッケージがnpmにある(同じスコープ:foo- org)。

あなたのインストール後は、次のようになります。

"scripts": {
    ...
    "postinstall": "mv .npmrc .npmrcc && npm i @foo-org/foo-pack --dry-run && mv .npmrcc .npmrc".
}

削除することを忘れないでくださいFOO-パック/ @ fooの-組織からの依存関係の配列を確認しますインストールNPMを試してみて、githubのからそれを取得し、追加することはありません--dryランを確実にするフラグpackage.jsonパッケージ-をnpmのインストール後、lock.jsonは変更されません。


0

私のアプローチは、レジストリスイッチを追加するわずかなコマンドラインバリアントを作成することでした。

これらのファイルは、npm実行可能ファイルがあるnodejsフォルダーに作成しました。

npm-.cmd

@ECHO OFF
npm --registry https://registry.npmjs.org %*

npm-

#!/bin/sh
"npm" --registry https://registry.npmjs.org "$@"

ここで、通常のnpmレジストリに対して操作を実行する場合(VPNに接続していないとき)、npm-通常はと入力する場所に入力しnpmます。

このコマンドをテストしてパッケージのレジストリを表示するには、次の例を使用します。

npm- view lodash

PS。私はWindowsを使用しており、これをBash、CMD、Powershellでテストしました。私も

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