ここで限界に挑戦しているのかもしれませんが、NuGetを活用して、自分がいるDLL地獄を緩和したいと思っています。
相互に関連するMercurialリポジトリにすべて存在する4つの主要な製品があります。それらはすべて3つのコアアセンブリを「共有」し、それ以外はほとんど製品固有です。ある製品が.NET4.0にアップグレードされ、.NET 4.0を必要とする外部依存関係を使用している一方で、別の製品が.NET 3.5にとどまっているため、管理が非常に困難になっています。
そのため、製品間の違いをマージする能力が失われました。
これを修正するには、3つのメインアセンブリを取り出して、独自のリリースサイクルで独自のプロジェクトに変換し、.NET 3.5と4.0の両方に対してコンパイルできるように注意してから、それらをに変換します。複数のフレームワークバージョンを含むNuGetパッケージ。
しかし、私は開発者がこれらのプロジェクトのソースを閲覧できるようにもしたいと思っています。
そこで、プライベートNuGetサーバーとプライベートSymbolSourceサーバーをセットアップしました。次に、すべてのリポジトリからのすべての変更を慎重にマージし、コアアセンブリを除くすべてを破棄しました。次に、.csprojファイルを入念に手動編集して、AnyCPUプラットフォームの代わりに、各プロジェクトに3.5および4.0のプラットフォームターゲットがあり、条件定数を指定して(System.Dynamicなどのプラットフォーム固有の機能を制御するため)、フレームワークのバージョンを設定します。
次に、「3.5デバッグ」、「3.5リリース」、「4.0デバッグ」、および「4.0リリース」のソリューション構成をセットアップしました。それぞれが適切な構成(デバッグまたはリリース)とプラットフォーム(3.5または4.0)を対象としています。
Visual Studio内で、どのプラットフォームでもすべてをうまく構築できます。NuGetに関しては、パッケージを作成する方法が2つあり、何かが足りない場合を除いて、どちらにも弱点があるため、問題が発生します。
プロジェクトファイルによるパッケージ
nuget pack MyProject.csproj -Build -Symbols -Version <insert-from-build-server> -Properties "Configuration=Release;Platform=3.5;"
これに関する問題は次のとおりです。
- 3.5バージョンがビルドおよびパッケージ化されている間、出力には「ターゲットフレームワークのビルドプロジェクト'.NETFramework、Version=v4.0'」と表示されます。
- 結果のパッケージを解凍すると、アセンブリが
lib\net40
間違っています。 - この方法で2つのフレームワークターゲットをパッケージ化する方法はないと思います。フォルダと規則を使用して、別の方法でパッケージ化する必要があります。
- フレームワークを一緒にパッケージ化して、MyProject(4.0として実行する)とMyProject.V35という2つのパッケージを作成することはできませんが、同じプロジェクトとnuspecを使用する方法がわかりません。そして、異なるIDで2つの異なる結果になります。
Nuspecファイルによるパッケージ
この方法では、すべてのmsbuildingを自分で実行してから、一連のファイルコピーを実行して、次のようなフォルダー構造を設定する必要があります。
* MyProject.nuspec
* net40
* MyProject.dll
* MyProject.pdb
* net35
* MyProject.dll
* MyProject.pdb
次に実行できますnuget pack MyProject.nuspec
が、シンボルを使用するソースがありません。.csprojファイルがないと、NuGetはすべてのソースファイルを取得する場所を特定できず、その方法に関するドキュメントが表示されないためです。これは、ディレクトリ規則のいずれかを使用します。
だから私の質問は:
- コンベンションベースのパッケージにソースファイルを追加する方法はありますか?
- プロジェクトベースのパッケージを異なるIDで2回パッケージ化する方法はありますか?
- おそらく私が考えていなかった別の道はありますか?
どんな考えでも大歓迎です。