2009-05-31 6 views
6

私はすぐに複数の異なるバージョン(Trial、Professional、Enterpriseなど)に分岐するプロジェクトに取り組んでいます。1つのコードベースから複数の製品を開発するための戦略

私はSubversionを最初にリリースして以来(そしてそれ以前のCVS)Subversionを使用していましたので、ブランチとタグの抽象概念には満足しています。しかし、すべての私の開発経験では、私は実際にトランクコードに取り組んできました。いくつかの稀なケースでは、リポジトリを所有していた他の開発者が、特定のブランチに変更を加えるようにと頼んだので、私は彼に何を求めてもやっただけです。私は奇妙な黒い芸術を "合併する"と考えており、慎重な監督の下でそれを試みたことはない。

しかし、この場合、私はリポジトリを担当しています。この種のことはまったく新しいものです。

コードの大部分はすべての製品間で共有されるため、コードは常にトランクに存在すると想定しています。私は、各製品のリリースビルド用のタグで、各バージョンのブランチがあると仮定します。

しかし、それ以外のことはあまりよく分かりません。私は、それを台無しにするための千と一つの方法があると確信しています。可能であれば、私はそれを台無しにしないようにしたいと思います。

たとえば、私はプロとエンタープライズのバージョンで新しい機能を開発したいと考えていますが、その機能をデモ版から除外したいとします。どうすればそれを達成できますか?

私の日常的な開発では、私が働いているときに開発スナップショットをブランチからブランチに(またはトランクに)切り替える必要があるとも仮定します。混乱を最小限に抑える方法で、これを行う最善の方法は何ですか?

その他の戦略、ガイドライン、ヒントはお勧めしますか?


UPDATE:

まあ、すべての権利、その後。

分岐のように見えるのは正しい戦略ではありません。だから私は "分岐"の焦点を削除する質問のタイトルを変更し、私は質問を広げている。私は私の他のオプションのいくつかを想定

は以下のとおりです。私は常にすべての機能を、ソフトウェアのフルバージョンを配布し、選択的ライセンスで承認に基づいて機能を有効または無効にするには、ライセンスを使用することができ

1) 。私がこのルートをとった場合、ある種のシングルトン「ライセンスマネージャ」オブジェクトを呼び出すif/elseブロックのラストネストを想像することができます。このような場合にコードスパゲッティを避ける最良の方法は何ですか?

2)私は依存性注入を使うことができました。しかし、一般的に、私はそれを嫌いです(ロジックをソースコードから構成ファイルに移してしまうため、プロジェクトが難しくなります)。それでも、私はまだ完全なアプリを配布し、実行時に機能を選択しています。可能であれば、エンタープライズ版のバイナリをデモユーザーに配布しないでください。

3)私のプラットフォームで条件付きコンパイルがサポートされている場合、#IFDEFブロックとビルドフラグを使用して機能を選択的に含めることができます。それは、GUI全体のパネルのような大きな、ちょっとした機能にはうまくいくはずです。しかし、例えばロギングや統計的なトラッキングのような、より小さくて横断的なコンサートはどうですか?

4)私はANTを使ってビルドしています。ANTのビルド時間依存性注入のようなものがありますか?

答えて

2

最も興味深い質問です。すべてを配布し、ライセンスキーを使用して特定の機能を有効または無効にするというアイデアが気に入っています。コードを調べて、特定の機能についてユーザーにライセンスが与えられているかどうかを確認する作業がたくさんあることについて、あなたは正当な懸念を持っています。あなたがJavaで作業しているように聞こえるので、ビルド時にライセンスチェック用のコードを挿入するためにアスペクトウィーバーを使用します。ライセンスチェックのすべての呼び出しが行われる1つのオブジェクトになる予定ですが、アスペクトを使用している場合は練習として悪くはありませんが、それは良い方法だと言います。

ほとんどの場合、何かがライセンスされていて、テーブルが常時メモリに保持されるように、コンポーネントの数が少なくなるだけで、読んでいるだけで読めないスレッディングに関する多くの問題。

代わりに、ライセンスを取得したコンポーネントごとに1つのjarを配布し、ライセンスを取得したクラスの読み込みのみを許可することもできます。これを達成するには、クラスローダーを結びつける必要があります。

2

Subversionでこれを行いますか?私は(例えばv1.0を、V2.0などをリリースごとに分岐)異なるリリースを維持するためにSubversionを使用しますが、私は同じコードベースから(トライアル/プロなど)の異なるエディションの構築を見てしまいます。あなたは、単に有効または無効にさまざまな機能を構築を通じて、あなたは別の枝を同期を気にすることしていないしている途中

。 Subversionを使用して異なるリリースと異なるバージョンを管理する場合、近い将来、ブランチやタグの爆発が見られます。

は、スイッチングのために、あなたは、単にチェックアウトのコードベースを維持し、異なるバージョンをチェックアウトするsvn switchを使用することができます。各スイッチの新しいチェックアウトを実行するよりもずっと時間がかかりません。

+0

それが途中で失敗する可能性がありますので、私は部分的に作業コピーを切り替えて、あなたを残して(バージョン管理外のファイルがバージョンのものを妨害しているなどの場合)「スイッチ」を使用してお勧めしません。各ブランチに対して1つのチェックアウトを行うと、混乱が少なくなります。 –

1

あなたは、ブランチングやマージのカートに素早く飛び乗ってはいけません。それはピタです。私は他の開発者と私のコードを共有したい場合、私はSubversionリポジトリを分岐したい

唯一の理由です。たとえば、機能をまとめて作業していてまだ完了していない場合は、ブランチを使用して通信する必要があります。さもなければ、私はできるだけトランクにとどまります。

私は2番目のブライアンの勧告は、ビルドではなくコードベースのリリースを区別するために。

関連する問題