CLI リリース管理スクリプト概要 (仮)
CLI リリース管理スクリプト仕様書
LismUI-Vue CLI (@lism-ui-vue/cli) は、Go でビルドされたバイナリを各 OS/Arch ごとに個別の NPM パッケージとして配信する構成をとっています。この複雑なリリースフローを安全かつ自動的に行うため、以下の 4 つのスクリプトが用意されています。
デプロイと実行の仕組み (アーキテクチャ)
この CLI は、ユーザーが npx @lism-ui-vue/cli を実行した際に、その環境に最適な Go バイナリを自動的に選択して実行する仕組みをとっています。
マルチプラットフォーム配信
NPM の optionalDependencies 機能を利用しています。
メインパッケージ (
@lism-ui-vue/cli): 実行用の JavaScript ラッパー (wrapper.js) のみを持ち、全プラットフォーム用のパッケージを依存関係として定義しています。OS別パッケージ (
@lism-ui-vue/cli-windows-amd64等): 各プラットフォーム専用の Go バイナリのみを含んだ軽量なパッケージです。
ユーザーがインストールする際、NPM は現在の OS/アーキテクチャに合致する OS別パッケージのみを自動的にダウンロードします。これにより、不要なバイナリ(Mac での実行時に Windows 用バイナリなど)をダウンロードせずに済みます。
実行時の詳細フロー
ユーザーがコマンドを入力してから Go バイナリが動くまでの、アダプター(JavaScript)を介した流れは以下の通りです:
コマンド実行: ユーザーが
npx @lism-ui-vue/cliや、インストール済みのlism-ui-vueコマンドを入力。アダプター (wrapper.js) の起動:
package.jsonのbin設定により、まずは JavaScript 実行環境(Node.js)でwrapper.jsが起動します。OS/CPU の判別:
wrapper.jsが実行環境の OS と CPU アーキテクチャをチェックします。適切なバイナリの特定: インストール済みの
optionalDependencies(OS別パッケージ)の中から、現在の環境に一致する Go バイナリ(Windows なら.exe等)のパスを特定します。プロセスの完全な引き継ぎ (重要): 特定された Go バイナリを Node.js の子プロセスとして実行します。ここでは単に起動するだけでなく、以下の「透明性」を確保しています:
引数の移譲: ユーザーが入力したコマンド引数(例:
init nuxt)をprocess.argv.slice(2)で抽出し、そのまま Go バイナリへ渡します。標準入出力の直結 (
stdio: 'inherit'): JavaScript 側のstdin/stdout/stderrを Go バイナリと直結させています。これにより、Go 側で実装されている 対話型プロンプト (pterm) やカラー出力、進捗インジケーター が、ユーザーのターミナル上で直接、違和感なく動作します。終了コードの同期: Go バイナリが処理を終えて返した終了ステータス(Exit Code)を JavaScript 側でキャッチし、
process.exit(status)で終了します。これにより、シェルスクリプトや CI ツールが、コマンドの成功・失敗を正しく検知できます。
Go による高速処理: アダプターによるわずかなオーバーヘッド(ミリ秒単位)の後は、コンパイル済みの Go バイナリがネイティブスピードで実際の CLI 処理(ファイル生成やパッケージインストール等)を実行します。
スクリプト一覧と詳細
1. setup-oidc.js (初期設定用)
NPM の Trusted Publishing (OIDC) をセットアップするためのスクリプトです。
仕組み:
まだ NPM に存在しない新規パッケージ名を予約するため、中身が空のプレースホルダーパッケージを一度パブリッシュします。
その後、GitHub Actions との信頼関係 (
npm trust) を構築し、パスワードやトークンなしで GitHub から安全にデプロイできるように設定します。
用途: 新しいバイナリパッケージ(例:新しい OS への対応)を追加した際の、初回のみ実行します。
2. sync-optional-dependencies.js (整合性維持用)
メインパッケージ (@lism-ui-vue/cli) の optionalDependencies に記載されているバイナリパッケージのバージョンを、現在の package.json のバージョンと一致させるスクリプトです。
仕組み: メインのバージョン番号を読み取り、依存関係にある
@lism-ui-vue/cli-*-*のバージョンをすべて同じ値に上書きします。実行タイミング:
apps/cli/package.jsonのprepackフックに登録されており、npm publish時に自動的に実行されます。
3. publish-npm.js (コア・自動化用)
GitHub Actions から全 7 つのパッケージ(バイナリ 6 種 + メイン 1 種)を一括でパブリッシュするためのメインエンジンです。
仕組み:
dist/内のビルド済みバイナリを各サブパッケージディレクトリにコピーし、適切なpackage.jsonを生成します。高度なタグ管理: NPM の OIDC 要件を満たすため、現在の
latestタグがプレリリース版(alpha等)であったり、まだ存在しない場合は、今回のリリースを自動的にlatestとして昇格させてパブリッシュします。
用途: CI/CD 環境での自動リリース。
4. promote-to-latest.js (運用補助用)
既存のプレリリース版(例:0.1.1-alpha.x)を、手動で NPM の latest タグに紐付けるためのユーティリティです。
仕組み:
npm dist-tag addコマンドを全パッケージに対して一括実行します。用途: プレースホルダーとしてパブリッシュされた
0.0.1を、最新のアルファ版などで上書きしたい場合に一度だけ使用します。
スクリプトの関係性とフロー
graph TD
A[setup-oidc.js] -- "初回のみ" --> B((NPM レジストリ))
C[sync-optional-dependencies.js] -- "自動同期" --> D[package.json]
D --> E[publish-npm.js]
E -- "一括デプロイ" --> B
F[promote-to-latest.js] -- "タグ調整" --> B初期化:
setup-oidc.jsで NPM 側の受け入れ態勢を整える。バージョン管理: 開発者がバージョンを上げると、
sync-optional-dependencies.jsが依存関係を整える。デプロイ: GitHub Actions が
publish-npm.jsを叩き、安全に全 OS 向けバイナリを配信する。メンテナンス: 必要に応じて
promote-to-latest.jsでタグの整理を行う。
これらのスクリプトをローカルで実行する場合は、適切な権限(npm login 済み)が必要です。