分散したチームでいくつかのクラスライブラリを開発しています。ソース管理にはSubversionを使用します。開発者の一人が、自分の標準的なプラクティスではなかった彼のbinとobjディレクトリをリポジトリにコミットしようとしています。ベストプラクティスは何ですか?長所と短所は何ですか?Subversionリポジトリにコンパイル済みのバイナリを追加する必要がありますか?
答えて
コンパイル済みのファイルをメインブランチに追加しないでください。あなたは通常のツールとそれらを比較することはできませんし、彼らはすべてを遅くなります。
リリースのバージョンブランチでは、コンパイラが変更されたなどの違いがないように、オリジナルのコンパイル済みファイルを含めることができます。しかし、おそらくあなたはバイナリリリースをどこかに保存しておき、Subversionは本当に適切な場所ではありません。
また、これらのファイルは時間の経過とともに変更されるため「除外」されています。したがって、すべてのコミットでは、他のファイルが変更されますが、コンパイルされたファイルではなく変更されたソースコードにのみ興味があります。
A.DLL
B.DLL C.DLL ...
だからあなたはXYZの改正で何が悪かったのかをチェックしようとしている想像して、あなたは次のように変更してご覧ください
d.cs
e.dll
... ... ...
しかし、あなたはおそらく、ソースにのみ関心があるので、汚染以外のファイルをバージョン管理することは、あなたが何をとにかくバイナリ内で変更することはできませんので、またので、あまり意味がありません。..
コンパイル時にbinとobjファイルが作成されているので、本当の必要はありません。それがベストプラクティスか、もっと個人的な意見か分かりません。
「完成したdll」のような別のフォルダや、完成したdllのものがあるとしますか?
なぜ私は、あなたがDLLの特定のバージョンを必要とする、維持する必要があるアプリケーションの異なるバージョンを持っている場合、ビンをコミットしたいと思うかもしれません。しかしその場合でも、タグ/ブランチから常に新しいビンを構築することができます。
OBJファイルをコミットするように、私はそれを行うための任意の正当な理由を考えることができないが...
私のルールは、生成されたすべてのファイルが除外されていることです。
私と同じですが、Webプロジェクトの例外は1つです。 DLLのいくつかはあなたのコードではないかもしれないし、サイトはソースからまっすぐに動かないだろうから。 Webプロジェクトでは、プロジェクトを新鮮に設定するための参照メカニズムはありません。 –
Webプロジェクトに関して、.refreshファイルを使用できませんでしたか?実際のDLLを指しているので、リポジトリからソースの新しいコピーを取得し、.refreshファイルが含まれていれば上手くビルドされます。 –
あなたがソースコードを持っていない限り、コンパイルされたライブラリをソースコントロールに追加しません。例えば
:私はソースが=「依存」フォルダのいくつかの種類の下でソース管理に行く持っていない
サードパーティのライブラリ/制御します。
私たちが書いたすべてのライブラリ=ソースのみがリポジトリにあり、バイナリはありません。
言い換えれば省略した理由がないかぎり、あなたのbinディレクトリをソース管理に追加しないでください。私はあなたのobjディレクトリをコミットする正当な理由を見ることができません。
通常、私はbinディレクトリをソース管理システムにバインドしません。その理由は、自動的に再現可能でなければならず、生成されたdllをソースコントロールに追加する価値がないからです。
同じことがソースファイルの生成にありますが、例外が1つあります。時間がかかったり、ソースファイルを生成するためのインフラストラクチャが必要な場合は、ソースコントロールに追加します。
異なるバージョンを管理したい場合は、ブランチアプローチが好きなものになります。
ソース管理システムにバイナリを保存しないようにしました。私たちがソースを持っていないライブラリでもありません。リポジトリにバイナリを置くと、リポジトリが膨らんでチェックアウトが遅くなります。
私たちはSubversionプロジェクトを構築するのにMavenを使用します。 Mavenでは、アプリケーションが必要とするすべてのバイナリは、Mavenリポジトリと呼ばれるものでSubversionの外に保存されます。 Mavenは、アプリケーションによって使用されるバイナリファイルに "バージョン"を添付するための規則を使用します。これらのファイルは、アプリケーションと開発者が簡単に共有できます(全員に1つのコピー)。
私が見た唯一のケースは、いくつかのバイナリが1つの層から別の層に分配されるn層アプリケーションにあります。
たとえば、コードの一部は、すべての層で使用される共通オブジェクトを表します。そして、各層は実際にバイナリとして参照される共通オブジェクトを使用する独自のサブプロジェクトですが、その層だけで作業することはバイナリだけに依存します。その場合、プロジェクト全体でソースコードがあるにもかかわらず、バイナリは実際にはサードパーティのライブラリのようにプロジェクトの一部です。
この場合、ソースコントロールからバイナリの正しいバージョンをフリーズして、ソースからビルドするとは限りませんが、階層が正常にコンパイルされていることを確認することができます。
言われているように、あなたがそのパラダイムを無効にし、各階層のビルドにすべての依存関係を含めることができれば、人生はずっと簡単になります。ソースの背後にあるプロジェクトの一部分のバイナリを他のソースの後ろに置くことは、綺麗ではなく、災害につながる可能性があります。
私たちはbinフォルダやobjフォルダをコミットせず、ライブラリという名前のリポジトリルートに新しいフォルダを作成しました。使用されているサードパーティのツール(ajaxtoolkit、fckeditorなど) 、....と他のdllファイルは、このプロジェクトにとって重要なものです。
さて、悪魔の主張をしましょう...ここでは、DLLをリポジトリに格納するケースです。
A社には、任意の時点で6つのチームがあります。これらのチームのほとんどは、C#で自社製品の少なくとも一部を開発しています。 A社の特定の性質を考えると、標準のDateTimeクラスには十分な機能がないため、DLLで使用できるDateTimeから派生した独自のクラスを開発しています。
それぞれ6つ以上のグループは独自のディレクトリをリポジトリに持ち、ほとんどの場合、DateTime DLLを必要とするため、コンパイルされたDLLのコピーが各製品ディレクトリに存在し、新しいコピーがディレクトリそのディレクトリ内のプロジェクトに必要な機能があります。
次の利点がある別のソリューションはありますか? 1)単一のプロジェクトで作業するために2つのディレクトリをチェックアウトすることを開発者が防ぎます。 (現実には2つ以上ありますが、この例では2つにします) 2)DateTimeクラスを変更する必要がある製品が1つだけの場合、QAがすべての製品を再テストすることを防ぎます。
プロジェクトによって参照されるカスタムライブラリはインクルードする必要がありますが、bin/objフォルダから生成されたファイルとは異なります。理想的には、カスタムライブラリをプロジェクトに含まれている "libs"フォルダに置いておくべきです。 –
なぜ彼はbinとobjディレクトリをコミットしたいのですか?彼には正当な理由がありますか? – Grant
も参照してくださいhttp://stackoverflow.com/questions/709372/alternative-to-binaries-in-subversion –