MPS 2023.3 ヘルプ

分岐を伴う移行の使用

分岐を伴うマイグレーションの使用

言語の進化をうまくサポートするために、移行ではクライアントコードを自動的にアップグレードして最新バージョンの言語または複数の言語を使用します。マイグレーションの資料では、MPS でマイグレーションを作成して実行するプロセスについて説明しています。簡単に言うと、言語の変更に準拠するようにモデルを変更するために、言語の作成者は移行を提供できます。MPS はプロジェクトで使用されている言語バージョンを自動的に追跡し、必要な移行を適用するようにエンドユーザーに要求します。

単一のブランチ開発を使用しても驚くことはほとんどありませんが、一般的なチーム設定では、機能とバグ修正のために複数のブランチが必要です。複数のブランチチームでは、異なるブランチで異なるバージョンの言語を使用するような状況には必然的に直面することになります。これは、マージ手順をより困難にします。

無痛マージの主な規則

2 つのブランチを円滑にマージするために、それらのブランチで使用されるすべての言語は同じバージョンでなければなりません。以下は、2 つのブランチで言語バージョンを簡単に同期させることを可能にする簡単なワークフローを説明します。

マージされたブランチのいずれにもマイグレーションは作成されていません

言語バージョンを同期するには、古いブランチの言語を更新して必要な移行を実行するだけです。両方のブランチは同じバージョンの使用言語を持ち、簡単にマージすることができます。

いくつかの移行が作成されました

考えられるすべてのケースは、それらの背後にある同じ考えを持っています。使用される言語のバージョンが異なるブランチを決してマージしないでください。マージする前に、すべてのマイグレーションを両方のブランチに伝搬する必要があります。

1. ブランチの 1 つで 1 つの移行が開発されました

移行を作成するときに実行する必要がある唯一の特別なことは、移行自体を含むコミット(C という名前)が必要ですが、同じコミットでコードを移行しないことです。移行されたファイルは、後で、たとえば次のコミットでコミットできます。

ここでの主なアイデアは、他のブランチに、使用されている言語の異なるバージョンをマージすることなく、新しい移行を取得する可能性を与えることです。

あなたのヒストリーはこのように見えます:

| --- C --- [ ブランチ 1]

------|

| ------------ [ ブランチ 2]

ブランチ b1 と b2 をマージする

  1. b2 を commit C とマージします。これで、b2 に新しい移行ができました。

  2. b2 で移行を実行します

  3. b1 の HEAD と合併する

非常に簡単ですね。

2. ブランチの 1 つでの 2 つ以上の移行

原理は変わりませんが、2 回以上繰り返されるだけです。

| ----- C1 — C2 – 【ブランチ 1 】

------|

| ------------ [ ブランチ 2]

  1. b2 を C1 とマージする

  2. b2 で C1 の移行を実行する

  3. C2 とマージ

  4. B2 でマイグレーションを実行する

  5. b1 とマージする

3. ブランチの両方で移行が作成されました

一般に、解決するのが難しいためこの状況を避けることをお勧めします。このシナリオは、すべての移行を 1 つの合意されたブランチ(マスターなど)でのみ作成することで回避できます。

しかし、このような状況に陥った場合は、これを適切に解決する方法があります。

| --- C1 ----- [ ブランチ 1]

------|

| --- C2 ----- [ ブランチ 2]

  1. b2 と C1、b1 と C2 をマージする

  2. b2 で C1 の移行、b1 で C2 の移行を実行します。

  3. ブランチをマージする

更新前チェック

ある時点で、単一のブランチに移行されたコードと移行されていないコードが混在することになった場合でも、心配する必要はありません。更新前チェックアクション ( メインメニュー | 移行 | 更新前チェックの実行 ) は、利用可能なすべての移行に対して、コードが完全に移行されているかどうかを確認するよう求めるアクションをトリガーします。古い言語バージョンを使用して記述されたノードが、移行されていないブランチから移行済みのブランチにマージされた場合、これらのノードが検出され、ユーザーは対応する移行を再実行することができます。

ノード ID で考えられる問題

  • 移行によって移行されたノードに新しい ID が設定された場合、2 つのブランチで並行して移行を実行してから、2 つのブランチをマージすると、移行されたコードの競合が発生します。

  • 移行によって新しいノードが作成され、それらの ID がランダムな値に設定された場合、2 つのブランチを個別に移行してからマージすると、再び競合が発生します。