Skip to content

refactor: リリースツールの差分を release_config.dart へ集約 - #34

Merged
LibraryLibrarian merged 1 commit into
developfrom
feature/release-tool-config
Sep 18, 2026
Merged

LibraryLibrarian merged 1 commit into
developfrom
feature/release-tool-config

Conversation

@LibraryLibrarian

Copy link
Copy Markdown
Owner

6リポジトリに分岐していた tool/src/release_project.dart のコピーを、バイト単位で同一にしました。

背景

同一目的のリリースツールが6リポジトリにあり、5種類に分岐していました(misskey_clientmastodon_client のみ同一)。差分を解析したところ、実質的な違いは3点だけで、残りは dart format の SDK バージョン差による折り返し位置の違いでした。

差分 client / mastodon auth emoji renderer parser
参照ファイル 12 README.md README ×2 README ×2 なし
1ファイルあたりの参照数 ちょうど1 ちょうど2 ちょうど1 1個以上
example/pubspec.lock 同期 あり

変更

3点を ReleaseConfig として tool/src/release_config.dart へ切り出しました。

const releaseConfig = ReleaseConfig(
  versionReferencePaths: <String>['README.md', 'README.ja.md'],
  referenceCount: VersionReferenceCount.atLeastOne(),
  exampleLockPath: 'example/pubspec.lock',
);

設定を YAML ではなく Dart の const にしたのは、依存を増やさずにアナライザの型検査を効かせ、実行時のパースエラーをなくすためです。

以下が6リポジトリでバイト単位で同一になります。

tool/src/release_project.dart
tool/bump_version.dart
tool/verify_release.dart
tool/release_notes.dart

テスト

2系統に分けました。

  • test/tool/release_project_test.dart — 合成プロジェクトに対し、全設定パターン(空 / exactly(1) / exactly(2) / atLeastOne / exampleLockPath)と、不整合時に1ファイルも書き込まずに失敗することを検証
  • test/tool/release_config_test.dart — 実ファイルに対して自リポジトリの設定を検証

後者により、参照ファイルの不整合がリリース実行時ではなく毎回の CI で落ちます。

テストのみ package:test(pure Dart)と package:flutter_test(Flutter)で import 1行が異なります。

挙動の差

misskey_mfm_parser は参照ファイルを持たないため旧実装が pubspec.yamlname を読んでいませんでしたが、共有実装は常に読みます。name が欠落または重複した pubspec.yaml の受理条件が変わります。正常なリポジトリでは影響しません。

それ以外は等価です。エラーメッセージの文言、全入力を検証してから書き込む構造、SemVer 比較、CHANGELOG の昇格畳み込み、renderer のみの lock 同期は維持しています。

検証

  • 6リポジトリで analyze クリーン、テスト全通過(parser 35件、他 33件)
  • misskey_client の実コピーに対する bump_version スモークテストで12ファイルの参照更新と verify_release 通過を確認
  • dart format は SDK で折り返し位置が変わります。 misskey_auth のみ Flutter 3.47.1、他5つは 3.38.7 のため、両方で --set-exit-if-changed が通ることを実測で確認しています。長いメソッドチェーンは中間変数へ分けました

release_project.dart は6リポジトリに分岐したコピーが存在していた。実質的な差は
参照ファイルの一覧、1ファイルあたりの参照数、example/pubspec.lock の同期有無の
3点だけで、残りは dart format のバージョン差による折り返し位置の違いだった。

3点を ReleaseConfig として切り出し、release_project.dart と各エントリポイントを
6リポジトリでバイト単位で同一にした。設定は YAML ではなく Dart の const とし、
依存追加なしでアナライザの型検査が効くようにしている。

bumpVersion / verifyRelease は config を必須の名前付き引数で受け取る。
release_notes.dart は出力先を引数で受け取る形に統一した。

テストは共有実装用と設定用に分けた。release_project_test.dart は合成した
プロジェクトに対して全設定パターン(空 / exactly(1) / exactly(2) /
atLeastOne / exampleLockPath)と、書き込み前に失敗することの保証を検証する。
release_config_test.dart は実ファイルに対して自リポジトリの設定を検証するため、
参照ファイルの不整合がリリース時ではなく毎回の CI で落ちる。テストのみ
package:test と package:flutter_test で import 1行が異なる。

挙動の差が1点ある。misskey_mfm_parser は参照ファイルを持たないため旧実装が
pubspec.yaml の name を読んでいなかったが、共有実装は常に読む。name が欠落
または重複した pubspec.yaml の受理条件が変わる。

Flutter 3.38.7 と 3.47.1 の dart format が同じ出力を返すことを確認済み。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@LibraryLibrarian
LibraryLibrarian merged commit 0233c2e into develop Sep 18, 2026
3 checks passed
@LibraryLibrarian
LibraryLibrarian deleted the feature/release-tool-config branch September 18, 2026 09:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant