3

私はオープン ソース プロジェクトMvcSiteMapProviderに取り組んでおり、展開の準備ができています。MVC2、MVC3、MVC4、および.NET 3.5、.NET 4.0、.NET 4.5をサポートするライブラリパッケージです。

Nuget Package: Use Different MVC Version When Availableに基づいて、 MVC のバージョンごとに Nuget パッケージを作成し、Nuget の内部バージョン検出で次のようにさまざまな .NET バージョンを処理する必要があるという結論に達しました。

  • MvcSiteMapProvider.MVC2
  • MvcSiteMapProvider.MVC3
  • MvcSiteMapProvider.MVC4

ただし、ライブラリ DLL に加えて、ターゲット プロジェクトにデプロイする必要があるさまざまなファイル (依存性注入構成、MVC DisplayTemplates など) があります。これらのファイルは、メイン プロジェクトの新しいバージョンが更新されたときに更新してはなりません。これらのファイルには、上書きしたくない最終開発者の編集が含まれている可能性が高いためです。

そのため、これやその他の理由から、これらが独自の Nuget パッケージに含まれている必要があることは明らかです。ただし、これらの他のパッケージは、いずれかがインストールされていることを確認するためだけに、メインの MvcSiteMapProvider.MVCx プロジェクトに依存する必要があります。

これらの他のパッケージのそれぞれについて、MVC のバージョンごとに個別の Nuget パッケージを作成することは意味がありません。この 1 つの依存関係を除いて、それらはすべてまったく同じです。理想的には、MvcSiteMapProvider.MVC2、MvcSiteMapProvider.MVC3、または MvcSiteMapProvider.MVC4 のいずれかに依存する単一の Nuget パッケージを作成し、それらのいずれも利用できない場合は、ターゲット プロジェクトの MVC バージョンに一致するものをインストールします。しかし、どうすればこれを達成できますか? それが不可能な場合、新しい MVC リリースごとに指数関数的に成長する多数の Nuget パッケージ (MVC バージョンの依存関係ごとに 1 つ) を作成する以外に、他にどのようなオプションがありますか?

明確にするために、次のような他の Nuget パッケージがあります。

  • MvcSiteMapProvider.Web
  • MvcSiteMapProvider.Configuration.Autofac
  • MvcSiteMapProvider.Configuration.Ninject
  • MvcSiteMapProvider.Configuration.StructureMap
  • MvcSiteMapProvider.Configuration.Unity
  • MvcSiteMapProvider.Configuration.Windsor

私はそれを次のように変更する必要を避けようとしています:

  • MvcSiteMapProvider.MVC2.Web
  • MvcSiteMapProvider.MVC2.Configuration.Autofac
  • MvcSiteMapProvider.MVC2.Configuration.Ninject
  • MvcSiteMapProvider.MVC2.Configuration.StructureMap
  • MvcSiteMapProvider.MVC2.Configuration.Unity
  • MvcSiteMapProvider.MVC2.Configuration.Windsor
  • MvcSiteMapProvider.MVC3.Web
  • MvcSiteMapProvider.MVC3.Configuration.Autofac
  • MvcSiteMapProvider.MVC3.Configuration.Ninject
  • MvcSiteMapProvider.MVC3.Configuration.StructureMap
  • MvcSiteMapProvider.MVC3.Configuration.Unity
  • MvcSiteMapProvider.MVC3.Configuration.Windsor
  • MvcSiteMapProvider.MVC4.Web
  • MvcSiteMapProvider.MVC4.Configuration.Autofac
  • MvcSiteMapProvider.MVC4.Configuration.Ninject
  • MvcSiteMapProvider.MVC4.Configuration.StructureMap
  • MvcSiteMapProvider.MVC4.Configuration.Unity
  • MvcSiteMapProvider.MVC4.Configuration.Windsor
4

1 に答える 1

0

ソース コードを見ると、MvcSiteMapProvider プロジェクトで複数のバージョンの Microsoft.AspNet.Mvc パッケージを参照しているようです。コンパイル プロセス中に bin フォルダーに入れることができる System.Web.Mvc のバージョンは 1 つしかないため (最新バージョン 5.0.0 が使用されます)、これが期待どおりに機能しているかどうかはわかりません。

そのため、Mvc V3 または V4 に依存するパッケージ内のコードは、期待する dll を実際には取得していません。

上記で参照した Autofac などのパッケージのほとんどには、特定の MVC バージョンをターゲットとする統合パッケージも含まれているため、投稿で言及したように、パッケージを小さなパッケージに分割する以外に選択肢がない場合があります。

この問題に対するより良いアプローチは、MVC のどのバージョンにも依存しないパッケージによって提供されるコア機能を分離することです。次に、コア パッケージと特定のバージョンの Microsoft.AspNet.Mvc に依存するさまざまなラッパー パッケージを作成できます。また、異なる構成ごとに同様のパッケージを作成すると、Autofac (例: Autofac.Mvc5 ) などのサード パーティ パッケージとそれに対応するバージョンの MvcSiteMapProvider.MvcX パッケージに nuget 依存関係があります。

于 2015-07-10T20:23:06.747 に答える