108

まず、私はこれについて知っています:社内ソフトウェアプロジェクト用のSubversionリポジトリをどのように編成しますか? 次に、実際の質問です。私のチームはリポジトリを再構築しており、リポジトリを整理するためのヒントを探しています。(この場合はSVN)。これが私たちが思いついたものです。1つのリポジトリ、複数のプロジェクト、複数のsvn:externals相互参照があります

\commonTools /*tools used in all projects. Referenced in each project with svn:externals*/
   \NUnit.v2.4.8
   \NCover.v.1.5.8
   \<other similar tools>
\commonFiles /*settings strong name keys etc.*/
   \ReSharper.settings
   \VisualStudio.settings
\trash /*each member of the team has trash for samples, experiments etc*/
   \user1
   \user2
\projects
   \Solution1 /*Single actual project (Visual Studio Solution)*/
      \trunk
         \src
             \Project1 /*Each sub-project resulting in single .dll or .exe*/
             \Project2
         \lib
         \tools
         \tests
         \Solution1.sln
      \tags
      \branches
   \Solution2
      \trunk
         \src
             \Project3 /*Each sub-project resulting in single .dll or .exe*/
             \Project1 /*Project1 from Solution1 references with svn:externals*/
         \lib
         \tools
         \tests
         \Solution2.sln
      \tags
      \branches

語彙をクリアするには:ソリューションは単一の製品を意味し、プロジェクトはVisual Studioプロジェクトです(単一の.dllまたは単一の.exeになります)

これが、リポジトリのレイアウトを計画している方法です。主な問題は、複数のソリューションがあることですが、ソリューション間でプロジェクトを共有したいと考えています。これらの共有プロジェクトを独自のソリューションに移動することには意味がないと考え、代わりにsvn:externalsを使用してソリューション間でプロジェクトを共有することにしました。また、共通のツールセットとサードパーティライブラリをリポジトリ内の1つの場所に保持し、それらがsvn:externalsを使用して各ソリューションでそれらを参照するようにします。

このレイアウトについてどう思いますか?特にsvn:externalsの使用について。これは理想的な解決策ではありませんが、すべての長所と短所を考慮すると、私たちが考えることができる最高のものです。どのようにそれをしますか?

4

8 に答える 8

92

以下の私の推奨事項に従うと(私は何年も前から持っています)、次のことができるようになります。

--プロジェクトのルートディレクトリから下にある構造を保持している限り、各プロジェクトをソース管理の任意の場所に配置します

-最小限のリスクと最小限の準備で、任意のマシンのどこにでも各プロジェクトを構築します

--バイナリ依存関係(ローカルの「ライブラリ」および「出力」ディレクトリ)にアクセスできる限り、各プロジェクトを完全にスタンドアロンでビルドします

-プロジェクトは独立しているため、プロジェクトの任意の組み合わせを構築して操作します

--独立しているため、単一のプロジェクトの複数のコピー/バージョンをビルドして操作します

-生成されたファイルまたはライブラリでソース管理リポジトリが乱雑にならないようにします

私はお勧めします(これが牛肉です):

  1. 各プロジェクトを定義して、.DLL、.EXE、.JAR(Visual Studioのデフォルト)などの単一の主要な成果物を作成します。

  2. 各プロジェクトを単一のルートを持つディレクトリツリーとして構造化します。

  3. ルートディレクトリにプロジェクトごとに自動ビルドスクリプトを作成します。このスクリプトは、IDEに依存せずに、最初からビルドします(ただし、可能であれば、IDEでのビルドを妨げないでください)。

  4. Windows上の.NETプロジェクト、またはOSやターゲットプラットフォームなどに基づく同様のプロジェクトのnAntを検討してください。

  5. すべてのプロジェクトビルドスクリプトに、単一のローカル共有「ライブラリ」ディレクトリからの外部(サードパーティ)依存関係を参照させ、そのようなすべてのバイナリをバージョンで完全に識別します: %DirLibraryRoot%\ComponentA-1.2.3.4.dll%DirLibraryRoot%\ComponentB-5.6.7.8.dll

  6. すべてのプロジェクトビルドスクリプトで、プライマリ成果物を単一のローカル共有「出力」ディレクトリに公開します:%DirOutputRoot%\ProjectA-9.10.11.12.dll%DirOutputRoot%\ProjectB-13.14.15.16.exe

  7. すべてのプロジェクトビルドスクリプトが、「ライブラリ」および「出力」ディレクトリ内の構成可能で完全にバージョン管理された絶対パス(上記を参照)を介してその依存関係を参照するようにします。

  8. プロジェクトに別のプロジェクトまたはそのコンテンツを直接参照させないでください。「出力」ディレクトリ内の主要な成果物への参照のみを許可してください(上記を参照)。

  9. すべてのプロジェクトビルドスクリプトが、構成可能で完全にバージョン管理された絶対パスによって、必要なビルドツールを参照するようにし %DirToolRoot%\ToolA\1.2.3.4ます%DirToolRoot%\ToolB\5.6.7.8

  10. すべてのプロジェクトビルドスクリプトが、プロジェクトルートディレクトリからの絶対パスでソースコンテンツを参照するようにします: ${project.base.dir}/src${project.base.dir}/tst(構文はビルドツールによって異なります)。

  11. 絶対的な構成可能なパス(構成可能な変数で指定されたディレクトリをルートとする)を介してすべてのファイルまたはディレクトリを参照するプロジェクトビルドスクリプトが常に必要です。${project.base.dir}/some/dirsまたは${env.Variable}/other/dir

  12. .\some\dirs\hereプロジェクトビルドスクリプトがまたはのような相対パスで何かを参照することを決して許可しないでください..\some\more\dirs。常に絶対パスを使用してください。

  13. C:\some\dirs\hereプロジェクトビルドスクリプトが、やなどの構成可能なルートディレクトリを持たない絶対パスを使用して何かを参照することを許可しないで\\server\share\more\stuff\thereください。

  14. プロジェクトビルドスクリプトによって参照される構成可能なルートディレクトリごとに、それらの参照に使用される環境変数を定義します。

  15. 各マシンを構成するために作成する必要のある環境変数の数を最小限に抑えてください。

  16. 各マシンで、必要な環境変数を定義するシェルスクリプトを作成します。これは、そのマシンに固有です(関連する場合は、そのユーザーに固有である可能性があります)。

  17. マシン固有の構成シェルスクリプトをソース管理に入れないでください。代わりに、プロジェクトごとに、プロジェクトのルートディレクトリにあるスクリプトのコピーをテンプレートとしてコミットします。

  18. 各プロジェクトビルドスクリプトに各環境変数をチェックするように要求し、それらが定義されていない場合は意味のあるメッセージで中止します。

  19. 各プロジェクトビルドスクリプトを要求して、依存するビルドツールの実行可能ファイル、外部ライブラリファイル、および依存するプロジェクトの成果物ファイルをそれぞれチェックし、それらのファイルが存在しない場合は意味のあるメッセージで中止します。

  20. 生成されたファイルをソース管理にコミットする誘惑に抵抗します。プロジェクトの成果物、生成されたソース、生成されたドキュメントなどはありません。

  21. IDEを使用する場合は、可能な限りプロジェクト管理ファイルを生成し、それらをソース管理(Visual Studioプロジェクトファイルを含む)にコミットしないでください。

  22. 開発者のワークステーションとビルドマシンにコピー/インストールするために、すべての外部ライブラリとツールの公式コピーを使用してサーバーを確立します。ソース管理リポジトリと一緒にバックアップします。

  23. 開発ツールを一切使用せずに継続的インテグレーションサーバー(ビルドマシン)を確立します。

  24. Ivy(Antで使用)などの外部ライブラリと成果物を管理するためのツールを検討してください。

  25. Mavenを使用しないでください。最初は幸せになり、最終的には泣きます。

これはいずれもSubversionに固有のものではなく、そのほとんどはOS、ハードウェア、プラットフォーム、言語などを対象としたプロジェクトに一般的であることに注意してください。OSおよびツール固有の構文を少し使用しましたが、説明のためだけです。 -私はあなたがあなたのOSまたは選択したツールに翻訳することを信じます。

Visual Studioソリューションに関する追加の注意事項:ソース管理に入れないでください!このアプローチでは、それらをまったく必要としないか、(Visual Studioプロジェクトファイルのように)生成することができます。ただし、ソリューションファイルは、個々の開発者に任せて、適切と思われる方法で作成/使用するのが最善だと思います(ただし、ソース管理にチェックインしません)。Rob.sln現在のプロジェクトを参照するファイルをワークステーションに保存しています。私のプロジェクトはすべてスタンドアロンなので、プロジェクトを自由に追加/削除できます(つまり、プロジェクトベースの依存関係の参照はありません)。

Subversionの外部(または他のツールの同様のもの)は使用しないでください。これらはアンチパターンであるため、不要です。

継続的インテグレーションを実装する場合、またはリリースプロセスを自動化したい場合でも、そのためのスクリプトを作成します。プロジェクト名(リポジトリにリストされている)とタグ名のパラメータを取得し、構成可能なルートディレクトリ内に一時ディレクトリを作成し、指定されたプロジェクト名とタグ名のソースをチェックアウトする単一のシェルスクリプトを作成します(その一時ディレクトリへのSubversionの場合の適切なURL)は、テストを実行して成果物をパッケージ化するクリーンビルドを実行します。このシェルスクリプトはどのプロジェクトでも機能するはずであり、「ビルドツール」プロジェクトの一部としてソース管理にチェックインする必要があります。継続的インテグレーションサーバーは、このスクリプトをプロジェクトを構築するための基盤として使用できます。または、それを提供することもできます(ただし、独自のスクリプトが必要な場合もあります)。

@VonC:互換性のないバージョンのAntで無意識のうちに実行したため、ビルドスクリプトが壊れたときに焼き付けられた後は、「ant-abcdjar」ではなく「ant.jar」で常に作業する必要はありません。これは、Ant1.6.5と1.7.0の間で特に一般的です。一般化すると、プラットフォーム(Java ABCD)やビルドツール(Ant EFGH)など、使用されているすべてのコンポーネントの特定のバージョンを常に知りたいと思うでしょう。そうしないと、最終的にバグが発生し、最初の大きな問題は、さまざまなコンポーネントのどのバージョンが関係しているかを追跡することです。その問題を前もって解決する方が簡単です。

于 2008-11-20T01:02:37.713 に答える
3

Subversion を使用したPragmatic Version Controlには、リポジトリを整理するために必要なものがすべて揃っていると思います。

于 2008-10-21T18:21:30.937 に答える
3

私たちはあなたが投稿したものとほぼ正確に一致するように設定しました. 一般的な形式を使用します。

\Project1
   \Development (for active dev - what you've called "Trunk", containing everything about a project)
   \Branches (For older, still-evolving supported branches of the code)
       \Version1
       \Version1.1
       \Version2
   \Documentation (For any accompanying documents that aren't version-specific

あなたの例ほど完全ではないと思いますが、私たちにとってはうまく機能し、物事を分けておくことができます. 各ユーザーが "Thrash" フォルダーを持つというアイデアも気に入っています。現在、このようなタイプのプロジェクトはソース管理に行き着いておらず、そうすべきだと常に感じていました。

于 2008-10-21T18:32:22.367 に答える
1

すべてが 1 つのリポジトリにあるのはなぜですか? プロジェクトごとに個別のリポジトリを用意しないのはなぜですか (「ソリューション」を意味します)。

少なくとも、私はリポジトリごとに 1 つのプロジェクトというアプローチに慣れてきました。あなたのリポジトリ構造は私には複雑すぎるようです。

そして、この 1 つの大きなリポジトリにいくつのプロジェクトを入れる予定ですか? 2? 3? 10? 100?

また、1 つのプロジェクトの開発をキャンセルする場合はどうしますか? 将来見つけにくくなるように、リポジトリツリーから削除するだけです。それともずっと放置?または、あるプロジェクトを別のサーバーに完全に移動したい場合は?

そして、これらすべてのバージョン番号の混乱はどうですか? 一方のプロジェクトのバージョン番号は 2、10、11 のようになり、もう一方のプロジェクトのバージョン番号は 1、3、4、5、6、7、8、9、12 のようになります...

私は愚かかもしれませんが、リポジトリごとに 1 つのプロジェクトが好きです。

于 2008-10-21T18:57:23.127 に答える
0

提案された構造の主な欠点は、共有プロジェクトが追加された最初のソリューションでのみバージョン管理されることだと思います (svn:externals が私が想像しているよりも凝っていない限り)。たとえば、Solution2 の最初のリリースのブランチを作成すると、Project1 は Solution1 にあるため、ブランチされません。後でその分岐からビルドする必要がある場合 (QFE リリース)、分岐時の Project1 のバージョンではなく、Project1 の最新バージョンが使用されます。

このため、共有プロジェクトを 1 つ以上の共有ソリューション (および構造内の最上位ディレクトリ) に配置し、ソリューションのリリースごとにそれらを分岐すると有利な場合があります

于 2008-10-21T18:55:01.713 に答える
0

私は似たようなレイアウトを持っていますが、幹、枝、タグが一番上にあります。つまり: /trunk/main、/trunk/utils、/branches/release/ など。

多くの翻訳ツールは、基本的な教科書の SVN レイアウトで最もよく機能するため、他のバージョン管理システムを試したいときに、これは非常に便利でした。

于 2008-10-21T18:33:19.463 に答える
0

相対パスの問題に追加するには:

それが問題かどうかはわかりません。
「Solution1」という名前のディレクトリの下にあるSolution1/trunkをチェックアウトするだけです。Solution2についても同様です。実際にブランチを表す「ディレクトリ」の目標は、ワークスペースにインポートされると見えなくなることです。したがって、'Solution1' (実際には 'Solution1/trunk') と 'Solution2' (Solution2/trunk) の間で相対パスが可能です。

于 2008-10-21T18:58:42.157 に答える
0

RE: 相対パスと共有ファイルの問題 -

これは svn 固有のようですが、それは問題ではありません。他の 1 人が既に別のリポジトリについて言及していますが、それはおそらく、任意の他のプロジェクトを参照する別のプロジェクトがある場合に私が考えることができる最良の解決策です。共有ファイルがない場合、OP ソリューション (および他の多くのソリューション) は正常に機能します。

私たちはまだこれに取り組んでおり、存在しないか貧弱なバージョン管理のセットアップを引き継いだので、今解決しなければならない 3 つの異なる取り組み (異なるクライアント) があります。

于 2008-10-21T19:11:49.807 に答える