アセンブリ // 複数のクライアントによって参照されるサード パーティ/共通アセンブリ。 // NUnit、MVC など:
[ベンダー名] [ライブラリ名] [バージョン番号]
「BINARY 依存関係を処理する方法」として知られるワームの缶を開けてしまいました。
そして、それを処理するSVNソリューションを見つけようとしています。
それで、あなたは簡単な修正を理解しようとしていますか?それとも、それに時間を割く準備はできていますか?
.......
Apache の「Ivy」は、2005 年からバイナリ依存関係の問題に取り組んできました。「Nuget」は数年前に参加しました。
簡単なケースを考えてみましょう。
「MyPDFHelper.dll」(元のバージョンは 1.0.0.1) というサード パーティ ライブラリがあります。それぞれ 3 つのプロジェクトを含む 2 つのソリューションがあります。(VS .sln および .csproj)。
Sln1, CSProjA, CSProjB, CSProjC
Sln2, CSProjW, CSProjX, CSProjY
Sln1/CSProjA depends on MyPDFHelper.dll, 1.0.0.1.
Sln2/CSProjX depends on MyPDFHelper.dll, 1.0.0.1.
PDFHelper は、MyPDFHelper.dll の新しいバージョン 1.0.0.2 をリリースします。重大な変更はありません。すべてがクールです。
PDFHelper は、MyPDFHelper.dll の新しいバージョン 2.0.0.1 をリリースします。重大な変更があります。
Sln2/CSProjX の開発者は、MyPDFHelper.dll、2.0.0.1 を使用したいと考えています。しかし、1.0.0.1からアップデートする予定のないSln1/CSProjAにはどのような影響があるでしょうか。
[VersionNumber] があるため、明らかに、この問題は既に発生しています。
しかし、ここに哲学的な問題があります。SVN はソース コード (基本的にはテキスト ファイル) 用に作成されていますか、それともソース コードとバイナリ リポジトリの組み合わせとして作成されていますか?
Ivy と Nuget は BINARY リポジトリです。
今は (Microsoft の世界でも) Ivy を使用しています。これは、「Nuget」というフレーズが発せられる前に依存関係の問題を解決したためです。
……
これは少し異なる問題ですが、似ています。
同じ「アプリケーション」プロジェクトがあります。
Sln1, CSProjA, CSProjB, CSProjC
Sln2, CSProjW, CSProjX, CSProjY
しかし、「フレームワーク」部分を含む .sln もあります。うまくカプセル化された電子メール送信コードだとしましょう。
MyCompany.EmailLibrary.sln MyCompany.EmailLibrary.csproj (MyCompany.EmailLibrary.dll に組み込まれます)
Sln1 / CSProjB uses MyCompany.EmailLibrary.dll.
Sln2 / CSProjX uses MyCompany.EmailLibrary.dll.
独自のフレームワーク部分に重大な変更を加えるとどうなりますか?
.........
一言で言えば。
コードをソースコード リポジトリに入れる代わりに、
バイナリ リポジトリに「公開」する
この例では:
MyPDFHelper.dll, 1.0.0.1. would be published
MyPDFHelper.dll, 1.0.0.2. would be published
MyPDFHelper.dll, 2.0.0.1. would be published
次に、MyPDFHelper.dll に「依存する」各プロジェクトには、「このバージョンの MyPDFHelper.dll を使用したい」という何らかの構成値があります。
アイビー表記は次のようになります
「1.0.0+」または「1+」。
そして、2.0.0.1 が「publish」の場合、Sln2 の構成を「2.0.0+」に変更できます。Sln1 構成は「1.0.0+」で変更されません
このようにして、各 Sln (1 および 2) は、ニーズに合ったバージョンの MyPDFHelper.dll を「取得」します。最終的に (そして開発者がそうすることを選択した場合)、Sln1 は "2.0.0+" に変更できますが、開発者は、他の開発者が新しいサードパーティの dll を入れたときではなく、必要に応じて重大な変更に対処できます。ソース管理。
.........
さて、MyCompany.EmailLibrary.dll についてです。基本的に、MyCompany.EmailLibrary.sln がビルドされるたびに、新しいビルドをバイナリ リポジトリに配置します。バグ修正だけなら、いつでもバージョン「1.0.0.1」を公開 (およびオーバーライド) できますが、私は増分番号で公開することを好みます。
MyCompany.EmailLibrary.dll v 1.0.0.333
MyCompany.EmailLibrary.dll v 1.0.0.334
MyCompany.EmailLibrary.dll v 1.0.0.444
(数値は重要ではありません。数値が増加するという事実だけです。
.........
Nuget (プライベート リポジトリを使用) または Ivy (COMMAND LINE オプションを使用) をチェックアウトします。
正確な解決策はありませんが、バイナリ リポジトリの概念を紹介します。
===================編集
「ソースコード構造」に関しては、次のようにします。
\DotNet\src\v20Base\v20\
\DotNet\src\v20Base\v20\Applications\
\DotNet\src\v20Base\v20\Framework\
\DotNet\src\v20Base\v20\ThirdParty\
\DotNet\src\v20Base\v35\
\DotNet\src\v20Base\v35\Applications\
\DotNet\src\v20Base\v35\Framework\
\DotNet\src\v20Base\v35\ThirdParty\
\DotNet\src\v40Base\v40\
\DotNet\src\v40Base\v40\Applications\
\DotNet\src\v40Base\v40\Framework\
\DotNet\src\v40Base\v40\ThirdParty\
\DotNet\src\v40Base\v45\
\DotNet\src\v40Base\v45\Applications\
\DotNet\src\v40Base\v45\Framework\
\DotNet\src\v40Base\v45\ThirdParty\
Example Application
\DotNet\src\v40Base\v40\Applications\
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\SodaManagerSolution.sln
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\Pres.AspNet\
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\Pres.WPF\
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\BusinessLogic\
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\DataLayer\
\DotNet\src\v40Base\v40\Applications\SodaManagerSolution\SqlScripts\
Example Framework
\DotNet\src\v40Base\v40\Framework\
\DotNet\src\v40Base\v40\Framework\MyCompany.EmailLibrary\
\DotNet\src\v40Base\v40\Framework\MyCompany.EmailLibrary\MyCompany.EmailLibrary.sln
\DotNet\src\v40Base\v40\Framework\MyCompany.EmailLibrary\MyCompany.EmailLibrary.csproj
DotNet 3.5 (および 3.0) は 2.0 の「オーバーレイ」でした。したがって、3.5 ソリューションは問題なく 2.0 dll を使用できます。4.0 は新しい CLR であり、新しい「v40Base」です。
やり過ぎのように感じるかもしれませんが、フレームワークが変更されると……大規模なソース コード リポジトリでは、どのプロジェクトが他のどのプロジェクトを参照できるかについて混乱し始めます。