2016-08-05 19 views
1

Ich habe Global nuget.config bearbeitet, um einen einzelnen Paketordner zu verwenden.NuGet/MSBuild Kopieren von Binärdateien in den lokalen Ausgabeordner ohne HintPfad

Ich habe ein neues leeres C# -Konsolenprojekt erstellt von VS2015. Ich füge eine NuGet-Referenz hinzu, zum Beispiel Newtonsoft.Json, dann erstellt VS eine packages.config und listet Newtonsoft.Json als Paket auf.

Diese Datei wird zur .csproj-Datei hinzugefügt.

<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <HintPath>..\..\..\CxCache\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> <Private>True</Private> </Reference>

Wenn das Projekt den Bau werden Newtonsoft.Json Binärdateien in lokale Ordner bin kopiert. Wenn ich die Newtonsoft.Json-DLL aus dem lokalen Bin lösche, wird sie nach einem Build erneut kopiert.

Allerdings möchte ich keine HintPath-Eigenschaft in csproj verwenden (nicht in Repo einchecken), also ich denke, ich sollte in der Lage sein, HintPath zu löschen, und es wird gut funktionieren. Ich entferne die HintPath-Zeile von .csproj und lösche Newtonsoft.Json dll aus dem lokalen Bin.

Dieses Mal beim Erstellen werden Newtonsoft.Json-Binärdateien aus dem globalen nuget-Paketordner nicht in die lokale Bin kopiert. Gibt es eine Arbeit?

+0

Normalerweise würden Sie verwenden „wiederherstellen Pakete auf Build“ zu vermeiden Überprüfung nugets in ... (eindeutig nicht eine Antwort auf Ihre Frage, aber wahrscheinlich das, was Sie tun sollten, anstatt) –

Antwort

1

Bin Ordner (TargetDir) - der Ordner, in dem Sie zu bauen, sollte nicht Teil Ihrer Quellcodeverwaltung sein. Sie brauchen HintPath, denn ohne es wird zuerst überprüfen GAC, und dann wird es überprüfen TargetDir, und dann wird es überprüfen ... es möglicherweise Newtonsoft dll der komplett anderen Version irgendwo auf Ihrem Laufwerk, die falsche Datei finden.

Sie müssen das Setup korrigieren, das Sie haben - überprüfen Sie nicht irgendwelche bin-Ordner in die Quellcodeverwaltung, jemals. Sie sollten Zweigstruktur haben und haben Pakete Ordner unter Ihrer Branche und alle Lösungen in Ihrer Branche kann damit arbeiten. Sie können Ihre gesamten Pakete Ordner einchecken, so dass die Lösung nicht jedes Mal herunterladen muss - das ist in Ordnung. Aber nie die Ausgabe einchecken. Siehe - HintPath kann relative Pfad enthalten, so dass Sie mit Ihrer Struktur wohin Sie wollen gehen. Morgen können Sie Ihre Verzweigung an einen anderen Ort in der Quellcodeverwaltung verschieben und Ihr relativer Pfad bleibt gültig. Auf jeden Fall - müssen Sie HintPath

+0

Vielen Dank dafür. So viel verstehe ich. Der Grund, warum ich keinen Hinweispfad haben möchte, ist, dass die anderen Leute, die diesen Repo benutzen, ihren eigenen globalen Paketspeicherort haben. Was Visual Studio als HintPath eingibt, ist möglicherweise nur für mich gültig. Ich frage mich nur, warum NuGet nicht auf packages.config schauen und den globalen Paketordner überprüfen kann. –

+0

@AndrewPham Wenn Sie Ihr Projekt/Ihre Lösung erstellen, ist nuget nicht beteiligt. Es ist IDE/msbuild, das versucht, den Referenzspeicherort einzurichten. Projektdatei ist eine Kompilierungsanweisung. Wenn Sie und andere Entwickler von verschiedenen Punkten aus arbeiten - das ist ein Problem. Alle Entwickler müssen (also wenn Sie ein gutes Leben haben wollen), müssen die gleiche Code-Struktur haben. Wenn Sie über einen bestimmten Speicherort für kompilierten Code sprechen, verwenden Sie den Netzwerkordner und verwenden Sie das Post-Build-Ereignis, um den Inhalt von targetdir an diesen Speicherort zu kopieren. –

+0

In der VS-Erfahrung können Sie es erhalten, um ein nugget-Paket in einen globalen Ordner herunterzuladen, in targetdir kopiert zu haben und einen Eintrag in packages.config mit einem Klick zu haben. Ist es wirklich unmöglich, dass es ohne HintPath eine Umkehrung gibt? Durch Lesen von packages.config, um die erforderlichen Binärdateien zu finden und nuget zu verwenden.config um den globalen Ordner zu finden, könnte es dann wie vorher funktionieren, lade das nugget Paket herunter (oder nicht wenn es schon da ist) und kopiere es in targetdir? –