VERSIONS.txtのバージョン重複を修正
Web AwesomeのVERSIONS.txtファイルでバージョン番号が誤って結合される問題が修正されました。この変更により、バージョン管理スクリプトがファイルの整合性を保つように改善されています。
背景
VERSIONS.txtには、これまでリリースされた全バージョンが記録されています。しかし、update-root-version.jsスクリプトの実装に問題があり、バージョン3.2.0と3.2.1が改行なしで「3.2.03.2.1」として結合されていました。
この問題は、スクリプトが新しいバージョンをファイルに追加する際の処理に起因していました。fs.appendFileSyncを使用していたため、既存の内容に改行なしで追記されるケースがあったと考えられます。
技術的な変更
packages/webawesome/scripts/update-root-version.js の処理フローが改善されました。ファイルの読み込み、バージョンの管理、書き込みの各段階で変更が加えられています。
変更前:
const versions = fs.readFileSync(versionsFile, { encoding: 'utf8' }).split(/\r?\n/);
if (!versions.includes(currentVersion)) {
fs.appendFileSync(versionsFile, webawesomePackageJSON.version);
}
変更後:
const versions = fs
.readFileSync(versionsFile, { encoding: 'utf8' })
.split(/\r?\n/)
.filter(Boolean)
.sort((a, b) => {
return a.localeCompare(b);
});
if (!versions.includes(currentVersion)) {
versions.push(currentVersion);
}
fs.writeFileSync(versionsFile, versions.join('\n'));
主な変更点は3つあります。
第一に、.filter(Boolean) が追加され、空行が除外されるようになりました。これにより、ファイル末尾の改行やその他の空行がバージョンリストから除外されます。
第二に、.sort((a, b) => a.localeCompare(b)) でバージョンがソートされるようになりました。コメントにあるように、将来的にはセマンティックバージョニングを理解した適切なソート処理への置き換えが予定されていますが、現時点では文字列の辞書順ソートが使用されています。
第三に、バージョンの追加方法が fs.appendFileSyncから配列操作とfs.writeFileSyncの組み合わせ に変更されました。新しいバージョンは配列にpushされ、最終的に改行で結合されたテキストとしてファイル全体が書き直されます。
VERSIONS.txt の修正では、結合されていた「3.2.03.2.1」が適切に分割され、2つの独立したバージョン番号として記録されるようになりました。
設計判断
ファイル全体の書き直し方式 が採用されました。
このアプローチは、追記方式(append)と比較して処理コストが高くなる可能性がありますが、ファイルの整合性を保証しやすくなります。バージョンリストのソートや空行の除去といった正規化処理を、書き込みのたびに確実に適用できます。
また、コメントで示されているように、現在の辞書順ソートは暫定的な実装です。セマンティックバージョニングのルール(major.minor.patchの数値比較)を理解したソート処理への移行が今後の課題として認識されています。現時点では「3.10.0」が「3.2.0」より前にソートされる問題が残りますが、段階的な改善方針が取られています。
まとめ
本PRは、VERSIONS.txtの書き込みロジックを改善し、バージョン番号の結合問題を解決しました。fs.appendFileSyncから配列ベースのアプローチに変更することで、ファイルの整合性を保ちながら、将来的なセマンティックバージョニング対応への道筋も示しています。