ホームページ > ウェブフロントエンド > jsチュートリアル > 複数のレジストリ間での NPM パッケージの同期

複数のレジストリ間での NPM パッケージの同期

Mary-Kate Olsen
リリース: 2024-11-25 07:53:11
オリジナル
972 人が閲覧しました

Syncing an NPM Package Between Multiple Registries

Unsplash の Nicolas Radzimski による写真

問題

私たちのチームは、パッケージの管理に内部 GitLab NPM レジストリを利用しています。これは内部配布には完全に機能しますが、パッケージを外部コラボレーターと共有する必要がある場合があります。パッケージを内部レジストリから外部レジストリに同期することが新たな課題となりました。

私は解決策を見つけようと試みましたが、いつものように一連のハードルに遭遇し、これが私の開発者の苦闘の新たな章となりました。

試み 1: HTTP リクエストを使用して NPM CLI を模倣する

当初、私はこれを生の HTTP リクエストで処理でき、基本的に NPM CLI が内部で行うことを模倣できると考えました。アイデアは単純でした。ソース レジストリにパッケージ メタデータをクエリし、tarball を取得して、ターゲット レジストリにアップロードします。

失敗した理由:

• プロセスが複雑すぎて脆弱でした。
• バージョンごとに package.json マニフェスト全体を手動で構築する必要がありました。
• あらゆる小さなミスがパッケージの破損につながりました。

試み 2: npm-registry-sync を利用する

次に、NPM レジストリを同期するために設計されたライブラリである npm-registry-sync を発見しました。このツールは問題をほぼ解決しました。変更を監視し、レジストリ間で複製することができます。

私にとってうまくいかなかった理由:

• 「デーモン モード」で動作し、更新を継続的にポーリングします。
• GitLab CI パイプラインでは、パイプラインによって完全に制御される 1 回限りの実行が必要でした。バックグラウンド プロセスは許可されません。

優れたソリューション: NPM CLI

最終的には、実績のある NPM CLI を使い続けることができることに気づきました。手順は簡単でした:

  1. レジストリ A からパッケージをローカルにインストールします。
    1. レジストリ B を指すように NPM を再構成します。
    2. パッケージをレジストリ B に公開します。

これは魅力的に機能しましたが、CI フレンドリーにするためにいくつかの追加の手順が必要でした。


複数のレジストリに対する NPM の構成

CI パイプラインでレジストリ構成を動的に管理するのは少し面倒でした。

これが私がそれを解決した方法です:

一般的な構成

npm CLI を使用すると、各レジストリのパラメータを設定できます。

npm config set "//my.awesome.registry.com:<parameter name>=<parameter value>"
ログイン後にコピー
ログイン後にコピー

重要な注意点:
構成内の URL にはプロトコル (https:) を除外する必要があります。

パッケージとレジストリの関連付け

特定の名前空間またはパッケージをレジストリに関連付けるには:

npm config set "<your namespace>:registry" "<your registry url with https:>"
ログイン後にコピー
ログイン後にコピー

CI パイプラインでの認証の処理

一部のレジストリではユーザー名とパスワードの組み合わせが必要でしたが、他のレジストリではトークンが使用されました。私が学んだことは次のとおりです:

トークン

トークンは簡単ですが、認証 URL を構成するときに必ずプロトコルを削除してください:

npm config set "//my.awesome.registry.com:<parameter name>=<parameter value>"
ログイン後にコピー
ログイン後にコピー

基本認証

基本的な認証ハッシュ (ユーザー名:パスワード) の生成には、細部にわたる注意が必要でした。一部のディストリビューションでは、base64 コマンドに他のコマンドとは異なる癖があります。

macOS の場合:

npm config set "<your namespace>:registry" "<your registry url with https:>"
ログイン後にコピー
ログイン後にコピー

あなたに(期待どおりに)与えます:

npm config set "//my.registry.com:_authToken=<token>"
ログイン後にコピー

docker linuxkit の場合:

echo -n "<my username & password hash>" | base64
ログイン後にコピー

ここで何が起こっているのでしょうか?改行があります!

一部のディストリビューションでは、秘密キーのフォーマットなどのために、ラップ パラメータのデフォルトが 76 文字に設定されています。

次のように動作します:

d2hhdCBhcmUgeW91IGRvaW5nIGhlcmU/IGdvdCB5YSEgc29tZSBtb3JlIHRleHQgdG8gbWFrZSB0aGlzIHJlYWxseSByZWFsbHkgbG9uZw==
ログイン後にコピー

echo -n は非常に重要です。省略した場合、echo は文字列の末尾に改行を追加し、これによりハッシュが操作されます。

完成したスクリプト

すべてをまとめると、スクリプトは次のようになります:

d2hhdCBhcmUgeW91IGRvaW5nIGhlcmU/IGdvdCB5YSEgc29tZSBtb3JlIHRleHQgdG8gbWFrZSB0
aGlzIHJlYWxseSByZWFsbHkgbG9uZw==
ログイン後にコピー

次のように使用できます:

echo -n "<my username & password hash>" | base64 --wrap 0
ログイン後にコピー

学んだ主な教訓

  1. シンプルなツールに固執する:
    npm CLI はこのタスクには使いにくいかもしれませんが、信頼性が高く、仕事を完了させます。

  2. 細部に注意してください:
    特に Base64 を使用した認証の構成には、プラットフォーム固有の微妙な癖がある可能性があります。

  3. CI フレンドリーに保つ:
    CI/CD パイプラインで作業する場合は、デーモンやバックグラウンド タスクなどのソリューションを避けてください。プロセスをパイプライン制御下に保ちます。

レジストリ間で npm パッケージを同期するのはイライラしますが、やりがいのある学習経験でした。もしあなたが同じような課題に直面しているなら、これらのレッスンが、もう少し楽にこの困難を乗り越えるのに役立つことを願っています!

以上が複数のレジストリ間での NPM パッケージの同期の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート