Unsplash の Nicolas Radzimski による写真
私たちのチームは、パッケージの管理に内部 GitLab NPM レジストリを利用しています。これは内部配布には完全に機能しますが、パッケージを外部コラボレーターと共有する必要がある場合があります。パッケージを内部レジストリから外部レジストリに同期することが新たな課題となりました。
私は解決策を見つけようと試みましたが、いつものように一連のハードルに遭遇し、これが私の開発者の苦闘の新たな章となりました。
当初、私はこれを生の HTTP リクエストで処理でき、基本的に NPM CLI が内部で行うことを模倣できると考えました。アイデアは単純でした。ソース レジストリにパッケージ メタデータをクエリし、tarball を取得して、ターゲット レジストリにアップロードします。
• プロセスが複雑すぎて脆弱でした。
• バージョンごとに package.json マニフェスト全体を手動で構築する必要がありました。
• あらゆる小さなミスがパッケージの破損につながりました。
次に、NPM レジストリを同期するために設計されたライブラリである npm-registry-sync を発見しました。このツールは問題をほぼ解決しました。変更を監視し、レジストリ間で複製することができます。
• 「デーモン モード」で動作し、更新を継続的にポーリングします。
• GitLab CI パイプラインでは、パイプラインによって完全に制御される 1 回限りの実行が必要でした。バックグラウンド プロセスは許可されません。
最終的には、実績のある NPM CLI を使い続けることができることに気づきました。手順は簡単でした:
これは魅力的に機能しましたが、CI フレンドリーにするためにいくつかの追加の手順が必要でした。
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:>"
一部のレジストリではユーザー名とパスワードの組み合わせが必要でしたが、他のレジストリではトークンが使用されました。私が学んだことは次のとおりです:
トークンは簡単ですが、認証 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
シンプルなツールに固執する:
npm CLI はこのタスクには使いにくいかもしれませんが、信頼性が高く、仕事を完了させます。
細部に注意してください:
特に Base64 を使用した認証の構成には、プラットフォーム固有の微妙な癖がある可能性があります。
CI フレンドリーに保つ:
CI/CD パイプラインで作業する場合は、デーモンやバックグラウンド タスクなどのソリューションを避けてください。プロセスをパイプライン制御下に保ちます。
レジストリ間で npm パッケージを同期するのはイライラしますが、やりがいのある学習経験でした。もしあなたが同じような課題に直面しているなら、これらのレッスンが、もう少し楽にこの困難を乗り越えるのに役立つことを願っています!
以上が複数のレジストリ間での NPM パッケージの同期の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。