web-dev-qa-db-ja.com

顧客固有のソフトウェアパッチを処理する現実的な方法は何ですか?

他の人が次の問題を解決した効果的な方法を集めようとしています。職場では、特定の顧客だけに表示したいソフトウェアパッチ(エンドユーザーシステムにインストールする)をリリースすることを余儀なくされました。カスタムコードは、独自のソース管理ブランチにあります。問題は、同期を保つために2つの並列コード行(およびビルドスクリプト)があり、元のコードにパッチを適用するたびに、顧客固有のコードにパッチを適用してテストする必要があることです。

他の組織はこのシナリオをどのように処理しますか? 単なる技術的な(ソース管理に関連する)ソリューションではなく、ビジネスソリューションにオープンです。たとえば、そのブランチの更新を受信できないことをお客様に伝えることについて話しました。

私たちの分岐戦略は次のようなものです( Visual Studio TFS Branching Guide に基づいていますが、Subversionを使用しています)。 enter image description here

16
Vimes

顧客固有のパッチの配布を開始すると、すぐに製品の新しいバージョンが作成され、製品と一緒に維持する必要があります。つまり、2つのバージョン間で変更を伝達する必要があります。通常、顧客固有のパッチは、ソースコードを含め、顧客が所有する必要のあるカスタマイズです。

fixへのパッチは、これが当面の問題に対する最適な一時的な修正ではない限り、メインラインブランチに組み込まれない可能性は低いと思われます。その場合、予想される修正がメインラインに組み込まれるまで、パッチを維持するだけで済みます。

5
Charles Lambert

キーは「目に見える」ように思えます-個別のコードブランチをまったく持たず、動作を変更する構成オプションについてはどうですか?

5
Loren Pechtel

これは短期的なものと長期的なもののどちらだと思いますか?事実、企業はすでにこの顧客に対応することを決定しているため、短期的にはすでにISビジネスの決定は、主に商慣行によって解決される(追加費用を受け入れる/顧客に費用を請求する)) 。

長期的には、構成(またはセットアップなど)を通じて顧客のニーズに簡単に対応できるようにソフトウェアをリファクタリングすると、おそらくコストが削減されます。

比較的短期間である場合、それらの変更をすぐにmain/developmentブランチにマージし、すべてのユーザーにも変更が表示される場合は、現在の状況の制限内で作業することはおそらく許容されます。私が言ったように、何をすべきかについての決定は、顧客に対応する決定がなされたときになされるべきでした。

短い話です。長期的には技術的に修正し、短期的にはそれで対処します。

もちろんコイントスです。あなたがその時点でいるなら、私は開発者が好むものなら何でもします。

3
ElGringoGrande

私たちはSubversionも使用しています-そのようなシナリオに出会います。

覚えておくべき重要なポイントは次のとおりです。

  1. 顧客にとっては特定のブランチを避ける必要がありますが、その必要性は可能な限り最小限に抑える必要があります。すべてに対して有効なソリューションを一般化できるかどうかを常に尋ねます。

  2. 顧客固有のブランチは、新しいリリースから作成する必要があります。バージョン1.2があり、バージョン1.2.1から1.2.11まで派生したものよりも、カスタマーブランチにすべてのパッチを許可する必要があるため、カスタマーブランチはメインバージョンに関してcompatibleのままにする必要があります。

  3. 互換性のない新しいバージョンを開始するときは、顧客固有のブランチを新しく作成する必要があります。残念なことに、どういうわけかre-do作業が必要になる場合があります。 1つの解決策は、顧客のブランチからすべてのパッチを作成して抽出する必要があり、互換性がある場合は何でも新しい顧客のブランチに適用することです。

  4. お客様固有の変更をプッシュして、ブランチまたはトランクをリリースする必要はありません。ただし、理想的には、そのような顧客固有の作業が削減され続けるように作業を一般化することを試みる必要があります。

これらのアイデアをまとめて表示しようとしました diagram below

2
Dipan Mehta

コードに拡張メカニズムを導入するのはどうですか?

あなたのメインコードは:

class Foo
{
}

プログラムが起動すると、ローカルカスタマイズ用のスタートアップフォルダーでDLL /道徳的に同等のものをチェックします。見つかった場合はロードされ、会社固有のバージョンのFooが含まれている可能性があります

class FooForABC : Foo
{
}

FooForABCはFooと同じ動作を実装しますが、ABCが必要とする特定の動作を提供するために必要に応じて関数をオーバーライドします。この手法は、サポートする必要があるシナリオを処理するのに十分な柔軟性を備えている必要があります。

1
Winston Ewert