2017-08-16 2 views
1

Ich habe ein Visual Studio-Projekt.
Es erfordert die Newtonsoft.Json-Bibliothek.
Es wird mit dem NuGet-Paket-Manager von Visual Studio 2017 referenziert. Tatsächlich ist die Version 10.0.3..Net NuGet Paket Konflikte - DLL Hell ist zurück

Dieses Projekt verweist auf das NuGet-Paket LibA und LibB.

Liba verwenden Newtonsoft.Json Version 8, und dies in der package.nuspec definiert ist:

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

libb verwenden NewtonSoft.Json Version 10, und dies wird in der package.nuspec definiert:

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

Wenn ich das LibA-Paket (z. B. von Version 1.1 auf 1.2) mit dem NuGet Package Manager von Visual Studio 2017 (in der Lösung) aktualisiere, aktualisiert es die Referenz des LibA-Pakets wie erwartet in der .csproj-Datei:

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

aber auch die Referenz der Newtonsoft.Json Bibliothek aktualisieren:

- <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> 

und die app/web.config-Datei:

- <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" /> 

Es ist auch richtig, die Liba Referenz aktualisiert in die package.config:

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

aber verlassen Sie die falsche ref erenz zum Newtonsoft.Json Bibliotheksversion:

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

ich bemängeln 2 Dinge:

  1. Wenn ich öffnen Sie das NuGet Package Manager es zeigt, dass ich die Newtonsoft.Json bin mit Version 10.0.3 im aktuellen Projekt:
    das ist nicht wahr, denn wenn ich die Lösung im Ordner bin erstellen es gespeichert ist Version 8.0.3 und es ist nicht möglich, die Newtonsoft.Json zu aktualisieren, weil es "bereits" aktualisiert.
    Außerdem mein Projekt und die libb, die tatsächlich die vesion 10 Version mit 8

  2. benötigt werden entscheiden, kann ich nicht die Version 10 automatisch beizubehalten, eigentlich muss ich und alle richtig verschmelzen manuell die .config und CSPROJ Dateien!

Es gibt eine Möglichkeit, diesen Albtraum zu vermeiden?

Zusätzliche Informationen.
Das Projekt und der LibB sind auf .Net 4.7 eingestellt.
LibA ist noch auf .Net 4.5.
LibA und LibB sind im NuGet-Repository des Unternehmens implementiert.

[Update]
Wie in den Kommentaren vorgeschlagen werde ich versuchen, die Newtonsoft.Json Bibliothek in den Liba (und libb) Pakete nicht enthalten. Tatsächlich geschieht es, weil dieser (glaube ich):

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

ich es so weit geändert:

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

und es funktioniert, wird das Newtonsoft.Json Paket von NuGet genommen.

+2

Können Sie das neue csproj-Format verwenden? Keine Hinweise Pfade, und es scheint besser zu bewältigen mit diesem ... –

+2

Es sieht aus wie LibA enthält Newtonsoft.Json.dll in seiner eigenen nupkg-Datei BTW, die für das Problem verantwortlich sein kann. –

+0

Können Sie liba nuget-Paket neu schreiben, um Newtonsoft Json zu referenzieren, anstatt die DLL zu kopieren? – dariogriffo

Antwort

0

Ihre erste Beschwerde ist nicht korrekt. Der NuGet Package Manager zeigt Ihnen, welche Version des NuGet-Pakets, nicht die Versionsnummer in der DLL eingebettet ist. Sie könnten argumentieren, dass der Paket-Manager dies erkennen sollte, aber es ist wirklich ein Edge-Fall, der durch ein schlechtes LibA-Paket verursacht wird.

Sie haben den Fehler behoben: <file src="bin\$configuration$\**\*.*" exclude="**\*.pdb" target="lib\net40"/> sollte nicht verwendet werden.
Idealerweise fügen Sie nur die Baugruppen hinzu, die beim Erstellen des Projekts erstellt wurden. Wenn Sie Abhängigkeiten sowohl intern (z. B. MyCompany.Common.dll) als auch extern (z. B. OtherCompany.dll) einschließen, besteht die Gefahr, dass dieses Problem auftritt. Setzen Sie die Abhängigkeiten auf einen internen NuGet-Server.

Verwandte Themen