2017-08-16 112 views
1

私はVisual Studioプロジェクトを持っています。
Newtonsoft.Jsonライブラリが必要です。
Visual Studio 2017のNuGetパッケージマネージャーで参照されています。 実際はバージョン10.0.3です。.Net NuGetパッケージの競合 - DLL地獄が戻ってきた

このプロジェクトは、NuGetパッケージLibAとLibBを参照しています。

LIBA Newtonsoft.Jsonバージョン8を使用し、これはpackage.nuspecに定義されている:

<dependency id="RestSharp" version="105.2.3" /> 
<dependency id="Newtonsoft.Json" version="8.0.3" /> 
<dependency id="CommonServiceLocator" version="1.3" /> 

LibB使用NewtonSoft.Jsonバージョン10と、これはpackage.nuspecに定義されている:

<dependency id="RestSharp" version="105.1" /> 
<dependency id="Newtonsoft.Json" version="10.0.3" /> 

Visual Studio 2017のNuGet Package Manager(ソリューション上)を使用してLibAパッケージ(たとえばバージョン1.1から1.2)を更新すると、.csprojファイルで期待通りにLibAパッケージの参照が更新されます。

- <HintPath>..\packages\LibA.1.1\lib\net40\MyService.dll</HintPath> 
+ <HintPath>..\packages\LibA.1.2\lib\net40\MyService.dll</HintPath> 

が、それはまたNewtonsoft.Jsonライブラリのリファレンス更新:

- <Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> 
- <HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath> 
+ <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> 
+ <HintPath>..\packages\LibA.1.2\lib\net40\\Newtonsoft.Json.dll</HintPath> 

アプリ/ web.configファイル:

- <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" /> 
+ <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" /> 

をまた正確でLIBAの参照を更新package.config:

- <package id="LibA.MyService" version="1.1" targetFramework="net45" /> 
+ <package id="LibA.MyService" version="1.2" targetFramework="net45" /> 

ただし、間違ったref Newtonsoft.Jsonライブラリのバージョンにレンス:

<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net47" /> 

私は約2物事文句を言う:私は私がNewtonsoft.Jsonを使用していることを示しているNuGetパッケージマネージャを開くと

  1. を現在のプロジェクトのバージョン10.0.3:
    binフォルダーにソリューションをビルドするとバージョン8.0.3 が格納され、Newtonsoft.Jsonは「既に」存在しているため更新できないため、これは当てはまりません。更新しました。
    さらにvesion 10を必要とする私のプロジェクトとLibBは、実際に私はは実際に私はすべて手動で.configファイルと.csprojをマージし、正しいする必要があり、自動的にバージョン10を維持することを決定することはできませんバージョン8

  2. を使用していますファイル!

この悪夢を避ける方法はありますか?

追加情報
プロジェクトとLibBが.Net 4.7に設定されています。 012B LibAはまだ.Net 4.5にあります。
LibAおよびLibBは、NuGet社のリポジトリに展開されています。私はLIBA(およびLibB)パッケージでNewtonsoft.Jsonライブラリを含まないように頑張りますコメントで示唆したように

[更新]
。私はこれにそれを変更し

<files> 
    <file src="bin\$configuration$\**\*.*" exclude="**\*.pdb" target="lib\net40"/>  
    </files> 

:これ(と思う)のため、実際にそれが起こる

<files> 
    <file src="bin\$configuration$\**\MyCompany.*.*" exclude="**\*.pdb" target="lib\net40"/>  
</files> 

、それは動作しますが、Newtonsoft.JsonパッケージはNuGetから取られています。

+2

新しいcsproj形式を使用できますか?ヒントはありません。 –

+2

LibAはNewtonsoft.Json.dllを独自のnupkgファイルbtwに含めているようですが、これは問題の原因となっている可能性があります。 –

+0

DLLをコピーする代わりにnewtonsoft Jsonを参照するliba nugetパッケージを書き直せますか? – dariogriffo

答えて

0

最初の申し立てが正しくありません。 NuGet Package Managerは、NuGetパッケージのバージョンを表示します。バージョン番号はDLLに組み込まれていません。パッケージマネージャーがこれを検出しなければならないと主張することはできますが、これは実際には不良なLibAパッケージによって引き起こされるエッジケースです。

修正プログラムについて:<file src="bin\$configuration$\**\*.*" exclude="**\*.pdb" target="lib\net40"/>は使用しないでください。
理想的には、プロジェクトを作成することによって生成されたアセンブリのみを含めることが理想的です。依存関係を内部(例:MyCompany.Common.dll)または外部(たとえばOtherCompany.dll)に含めると、この問題が発生する危険性があります。依存関係を内部のNuGetサーバーに置きます。

関連する問題