13

私は、さまざまなライブラリを介して多くのコードを共有するいくつかの(かなり小さな)プログラムを担当しています。さまざまなプログラム(およびライブラリ)を開発し、すべてのプログラム間でライブラリの同期を維持するのに最適なリポジトリレイアウトは何でしょうか。

議論のために、2つのライブラリを持つ2つのプログラムがあるとしましょう。

  • プログラム1
    • Library1
    • Library2
  • プログラム2
    • Library1
    • Library2

当然、ライブラリのバグ修正と機能拡張は(最終的には)すべてのプログラムに統合されるはずです。ライブラリはさまざまなプログラムで作業しているときに作業しているため、外部定義を使用することは問題外のようです。

そのため、1つの場所を除いてすべてのライブラリをベンダーのブランチとして扱うことを考えましたが、これに最適なレイアウトが何であるかはわかりません。

私は次のようなことを考えていました。

  • ライブラリ
    • Library1(祖先)
    • Library2(祖先)
  • プログラム1
    • Program1コード
    • Library1(ベンダーブランチ)
    • Library2(ベンダーブランチ)
  • ..。

次に、Program1を開発するときに、Library2にいくつかの変更が加えられた場合、それらをリポジトリのLibraries部分にマージして戻し、必要に応じてそこから他のすべてのプログラムにマージします。

他のプログラムへのマージは常にすぐに行われるとは限りません。Program2で作業している人はリリースに近づき、最初にリリースを終了し、タグを作成してから、すべてのライブラリを更新する可能性があります。

これにより、しばらくすると多くのマージとメンテナンスの問題が発生するのではないかと少し心配していますが、これ以上の解決策は見当たりません。

繰り返しになりますが、これは私にはかなり一般的なユースケースのように思われるので、stackoverflowコミュニティに質問したいと思いました。これを実現するための最適なリポジトリレイアウトは何ですか?

4

2 に答える 2

9

まあ、私は外見が問題外であることに同意しないと思います. 私は過去に同様の問題を抱えていました。svn プロパティの外部を使用して解決しました。

ライブラリ リポジトリを作成します。

svnadmin create /path/library1
svnadmin create /path/library2
...

クライアント リポジトリを作成します。

svnadmin create /path/program1
svnadmin create /path/program2
...

次に、ライブラリをプログラム リポジトリ内で外部として宣言します。

cd /path/program1
svn propset svn:externals "library1 svnpath://wherever/library1/trunk/" .
svn propset svn:externals "library2 svnpath://wherever2/library2/trunk/" .

これで、プログラム 1 と 2 に変更を加えることができます。これらのプロジェクトのルートでコミットを行っても、ライブラリには影響しませんが、ライブラリに変更を加える必要がある場合は変更できます。次に、ライブラリ リポジトリへの書き込み権限がある場合に限り、それらの変更もコミットできますが、ライブラリのサブディレクトリからのみです。

つまり、これはライブラリへのコミットを行いません...

... make a change in /path/program1/library1 ... 
cd /path/program1
svn commit -m "some change"

これにより、上記のライブラリで行われた変更がコミットされます。

cd /path/program1/library1
svn commit -m "change to library code"
于 2008-10-13T19:48:52.717 に答える
1

ライブラリのソースがプログラム ツリーに存在する必要があるのはなぜですか。ライブラリを個別にコンパイルし、プログラムにリンクします。

于 2008-10-13T19:44:00.447 に答える