alpha ディストリビューションタグでのリリーススクリプトを追加
yarn release がデフォルトで npm publish を実行し、タグを付けないためプリリリースが latest として扱われてしまう問題を解消するため、release:alpha スクリプトが追加されました。これによりアルファ版は alpha ディストリビューションタグで公開され、安定版の latest タグが保護されます。
背景
現在、yarn release はタグ指定なしで yarn publish を呼び出すため、npm が自動的に公開されたバージョンを latest タグに割り当てています。実際の dist‑tags は次の通りです。
latest: 0.9.19-alpha.1 ← a prerelease is the default install
canary: 0.9.19-alpha.autocapitalize
beta: 0.9.6-beta.bc0
next: 0.9.15-beta.next-0
結果としてアルファ版が標準インストールの対象となり、利用者に意図しないプレリリースが配布されます。
さらに、npm install @37signals/lexxy が 0.9.19-alpha.1 を取得し、安定版が隠れる原因となります。将来的に新たなアルファリリースが latest を上書きし続けるリスクがあります。
したがって、アルファ版を latest から分離し、安定版のみが標準インストールされる仕組みが必要です。
技術的な変更
package.json の scripts セクションに新しいエントリ release:alpha が追加されました。release スクリプトはそのまま残し、release:alpha には --tag alpha オプションが付与されています。
@@ -52,7 +52,8 @@
"test:browser:debug": "npx playwright test --config test/browser/playwright.config.js --debug",
"prerelease": "yarn build:npm",
- "release": "yarn build:npm && yarn publish"
+ "release": "yarn build:npm && yarn publish",
+ "release:alpha": "yarn build:npm && yarn publish --tag alpha"
},
"dependencies": {
"@lexical/clipboard": "^0.44.0",
yarn publish --tag alpha は Yarn Classic 1.22 でもバージョン番号のプロンプトや git タグ作成を従来通り行い、npm に alpha タグを付与します。latest タグには影響を与えません。その結果、npm install @37signals/lexxy は latest(安定版)を、npm install @37signals/lexxy@alpha はアルファ版を取得できます。
この変更は既存の release スクリプトを変更せず、追加のスクリプトだけでタグ管理を分離できる点が特徴です。
設計判断
今回の実装は スクリプトレベルでのタグ指定 というシンプルな設計選択です。代替案として release スクリプトにタグ引数を組み込む方法や、自動的に npm dist-tag を調整するロジックの追加も検討されましたが、既存 CI/CD フローやローカル開発手順を崩さず導入できる点が判断基準でした。
release:alpha の導入は後方互換性を保ちます。既存の release スクリプトはそのまま使用でき、新しいスクリプトはアルファ版の公開専用としてオプション的に提供されます。これによりタグ混乱リスクが低減し、安定版とプレビュー版の切り分けが明確になります。
以上の設計判断により、タグ管理の明確化とリリースフローの安全性が同時に実現されています。
まとめ
release:alpha の追加により、アルファプレリリースが latest タグを汚染せずに公開できるようになりました。yarn release:alpha を実行すれば alpha タグ付きで npm に公開され、npm install @37signals/lexxy は安定版、npm install @37signals/lexxy@alpha はアルファ版を取得できます。既存フローはそのまま維持され、安定版とプレビュー版の切り分けが容易になります。