14

git を使用したいくつかの顧客プロジェクトで小さなランダムな更新を行う Web プロジェクトをバージョン管理するためのより良い提案はありますか?

Web プロジェクトのバージョン管理に git を使用したいと考えています。他のほぼすべての提案との主な違いは、これが HTML、JavaScript、およびいくつかの PHP ファイルを使用する Web プロジェクトであることです。典型的な Linux パッケージのように、1 つまたは複数のプログラムで使用される中央ライブラリはありません。

私のさまざまな Web プロジェクトはすべて、同じプラットフォーム ファイルに基づいてさまざまな顧客向けに作成されています。ファイルの 80% は同一であり (プラットフォームと呼びます)、20% はさまざまな顧客のニーズに合わせて変更されていると推定されます。ここでの問題は、顧客の更新が必要なファイルがわからないことです。詳細には、すべての顧客が異なります。

プラットフォーム固有のファイルを 1 つのディレクトリに保持し、これらのファイルを別のディレクトリにある顧客固有のファイルと重ね合わせるのが最適です。これをgitで解決するには、これまでのところ本当に良いものは何も見つかりませんでした:

  • git サブモジュール(ここで提案されているようなもの) は、通常、ベンダーが開発したライブラリのソースを、それをリンクするプログラムの近くに配置するように設計されています。したがって、問題は、プラットフォーム ファイルと顧客ファイルが異なるディレクトリにあることです。そのため、展開中にこれらを混在させて、Web サーバー用のファイルを作成する必要があります。さらに、ディレクトリ ツリーの同期を手動で維持する必要があり、10 のディレクトリ階層を使用すると、非常に多くの作業が必要になります。一般に、サブモジュールを使用した大きな管理作業について多くの投稿が不平を言っていますが、それはやり過ぎのようです。
  • git サブツリー(ここで提案されているように) はサブモジュールよりも単純に見えますが、異なるディレクトリで同じ問題を抱えているため、ディレクトリ構造を同期させ、展開中にファイルを混在させる必要もあります。さらに、顧客リポジトリからプラットフォームの変更をプッシュバックすることは困難です。
  • GitSlave (ここで提案されているように) これが私にとって有益かどうかはわかりません。複数の git リポジトリの同期を維持できます。プラットフォームのディレクトリ構造の同期に役立つかもしれませんが、信じられません
  • 異なるディレクトリにあるプラットフォーム ファイルと顧客ファイルの間のリファクタリング(このディスカッションの結果のように) 私の顧客と Web プロジェクトで使用されるテクノロジの場合、これはまったく不可能だと思います。ある顧客の場合はこのページを更新する必要があり、別の顧客の場合はそのページを更新する必要があります。PHP フレームワークを導入する場合でも、顧客固有の変更はツリー全体に広がります。
  • チェックアウト(前回の投稿でのこの議論でも提案されているように) これは非常に単純で有望に見えますが、すべての顧客固有のファイルが git の外部にある (つまりバージョン管理の外部にある) という欠点があります。さらに、ファイルがプラットフォームと顧客で更新された場合、git pull は失敗します - 中止されるため、これは使用できません
  • 私が学んだように、ベンダー ブランチ(ここで再開されたものなど)、ブランチは元に戻されるように作成されており、それは私の顧客固有のパッチを対象としたものではありません。これらのブランチは常に開いており、プラットフォーム (メイン) から顧客への更新後にのみマージされます。そして、これは、すべての顧客とプラットフォーム情報を保持するメガライト リポジトリにつながります。これは、リポジトリを処理する git の方法ではありません。
  • 展開中に混合します。したがって、プラットフォーム ファイルを 1 つのリポジトリに保持し、顧客ファイルも専用のリポジトリに保持する非常に実用的な方法です。Web サーバーへのファイルの展開中に、最初にすべてのプラットフォーム ファイルを書き込み、次にそれらの一部をプラットフォーム固有のファイルで上書きできます。混合は、Web サーバー ディレクトリで非常に遅く発生します。これには、各顧客のディレクトリ構造をプラットフォーム構造と手動で同期する必要があるという欠点もあります。そうしないと、展開が複雑になりすぎます。

ここで最善のアプローチは何ですか?

4

2 に答える 2

5

TL;DR

これは実際にはアーキテクチャ設計の問題であり、ソース コード管理の問題ではありません。とはいえ、これはよくある興味深い問題であるため、アーキテクチャ上の問題に対処する方法について一般的なアドバイスを提供します。

Git の問題ではない

ここでの問題は実際には Git ではありません。問題は、顧客間で変わらないものと変更されるものを適切に区別していないことです。正しい設計パターンを決定すると、適切なソース管理モデルがより明確になります。

Russ Olsen からの次の引用を考えてみましょう。

【分ける】変わりそうなものと変わらないもの。システム設計のどの側面が変更される可能性があるかを特定できれば、それらの部分をより安定した部分から切り離すことができます。

オルセン、ラス (2007-12-10)。Ruby のデザイン パターン (Kindle Locations 586-588)。ピアソン教育 (米国)。キンドル版。

リファクタリングの提案

私はあなたのアプリケーションについて具体的なアドバイスを提供できるほどよく知りませんが、一般的に、 Web プロジェクトはいくつかの異なる設計パターンから恩恵を受けることができます。テンプレート、複合、またはプロトタイプのパターンはすべて適用できる可能性がありますが、パターンについて議論することは、問題を解決するよりも混乱させることがあります。

順不同ですが、私が個人的にやりたいことは次のとおりです。

  1. ビュー層では、テンプレートに大きく依存します。プレゼンテーション層オブジェクトをより簡単に構成できるように、レイアウト、インクルード、またはパーシャルを多用します。
  2. コアコードを変更せずにカスタマイズを容易にするために、顧客固有の構成ファイル (この目的では YAML が好きです) を多用します。
  3. モデル層とコントローラー層で、適切な構造パターンを選択して、顧客固有の構成ファイルに基づいてオブジェクトが多態的に動作できるようにします。ダックタイピングはここであなたの友達です!
  4. ホスト名またはドメインに基づくイントロスペクションを使用して、各クライアントのポリモーフィックな動作を有効にします。

Git の次のステップ

アプリケーションをリファクタリングして顧客間の変更を最小限に抑えると、各クライアントからポリモーフィック コードを隠そうとしない限り、コードを個別に保持する必要さえないことに気付くかもしれません。そのような場合は、その時点でサブモジュールまたは個別のブランチを確実に調査できますが、ブランチ間の重度の重複の負担はありません。

シンボリックリンクもあなたの友達です

最後に、変更をいくつかのサブディレクトリに分離できる場合、Git はシンボリック リンクをサポートします。開発ブランチのクライアントごとのサブディレクトリにすべてのさまざまなコードを配置し、クライアントごとのリリース ブランチの適切な場所にファイルをシンボリック リンクすることができます。一部のシェル スクリプトを使用して、または自動展開中にこれを自動化することもできます。

これにより、すべての開発コードを 1 か所 (開発ブランチなど) にまとめて簡単に比較したりリファクタリングしたりできますが、実際にリリースごとに異なる必要があるコードは、本番環境にロールアウトするときに必要な場所に配置されます。

于 2012-08-11T15:15:41.553 に答える
2

ベンダー ブランチは、ベンダーごとにソリューションをカスタマイズする方法の性質上、最も理にかなっています。最善の方法は、これをやめてマルチテナント アプリケーションを開発することです。

于 2012-08-11T14:59:28.320 に答える