Gibt es eine Möglichkeit, NuGet Package Source-Einstellungen pro Lösung vorzunehmen?

84

Kennt jemand eine Möglichkeit, Visual Studio dazu zu bringen, die Konfiguration der NuGet-Paketquellen pro Lösung anstatt auf alle Lösungen anzuwenden? Ich habe immer wieder Probleme mit der Versionierung, weil ich an mehreren Projekten arbeite, die jeweils über eigene private NuGet-Repositorys verfügen. Es ist eine Qual, sich immer wieder daran zu erinnern, welches NuGet-Repo zu welchem ​​Projekt gehört, und zurück zu gehen und das richtige auf das richtige Projekt anzuwenden.

BenAlabaster
quelle
Nicht sicher was du meinst. Sie können nur die Nuget-Paketquellen für alle Lösungen konfigurieren. Ihre package.config-Datei enthält die Versionen der Nuget-Repos, die Ihr Projekt benötigt. Nicht automatisch aktualisieren. Können Sie ein Beispiel geben, was Sie tun möchten?
Shyamal Desai
1
@Shyamal Ich habe über die NuGet-Paketquellen gesprochen, nicht über die Pakete selbst ... Ich habe herausgefunden, wie es geht.
BenAlabaster

Antworten:

138

TLDR: Ja

NuGet verwendet eine hierarchische Anwendung von Paketquellen, beginnend mit NuGet.config auf der Ebene Ihres Windows-Benutzerprofils, und wendet dann eine immer detailliertere Konfiguration an, beginnend am Stammverzeichnis des Dateipfads, der Ihre Lösung enthält, und endet schließlich mit dem Verzeichnis, das Ihre enthält Lösungsdatei.

Folgendes habe ich herausgefunden - mit freundlicher Genehmigung eines hilfreichen Twitterers, der mich auf dieses Dokument hinweist:

https://docs.nuget.org/consume/nuget-config-file

Wenn Sie die NuGet-Paketquellen in der Tools > NuGet Package Manager > Package Manager Settings: Package SourcesOption von Visual Studio bearbeiten , werden diese Änderungen standardmäßig auf die Datei NuGet.config in Ihrem %APPDATA%\NuGetVerzeichnis angewendet . Um diese Einstellungen pro Lösung (oder pro Lösungsgruppe) zu überschreiben, müssen Sie eine strategisch platzierte NuGet.config-Datei irgendwo auf dem Pfad Ihrer Lösung oder Lösungen hinzufügen.

Wenn Sie das NuGet-Dokument lesen, wird alles klar. Mit der folgenden Lösung können Sie schnell eine Konfiguration für eine einzelne Visual Studio-Lösung angeben:

  1. Navigieren Sie zu% APPDATA% \ NuGet und holen Sie sich eine Kopie von NuGet.config
  2. Legen Sie eine Kopie im Stammverzeichnis Ihrer Lösung ab - dh dort, wo Application.sln lebt.
  3. Überschreiben Sie die auf Ihr Benutzerprofil angewendeten Standardeinstellungen, indem Sie die Kopie so bearbeiten, dass sie nur die für diese Lösung relevanten NuGet-Paketquellen enthält, z. B. die private NuGet-Quelle, die proprietäre Pakete für diese Lösung enthält, jedoch nicht auf andere Projekte angewendet werden sollte - zum Beispiel:
<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>

  <activePackageSource>
    <add key="All" value="(Aggregate source)" />
  </activePackageSource>

  <packageSources>

    <!-- Ditch all the Global NuGet package sources we only want a 
         single private NuGet repo for this project -->
    <clear />

    <!-- Add the private NuGet package source for this solution -->
    <add key="My Private NuGet Server" value="http://myprivatenuget.com:8080/nuget" />

  </packageSources>

  <disabledPackageSources>

    <!-- Add any package sources to ignore here using the same keys as 
         defined in the packageSources list above-->

    <!--<add key="nuget.org" value="true" />-->

    <add key="Microsoft and .NET" value="true" />

  </disabledPackageSources>

</configuration>

Wenn Sie möchten , eine Konfiguration auf mehrere Lösungen anzuwenden, sicherzustellen , dass Ihre Lösung Ordner alle in einem gemeinsamen Verzeichnis enthalten sind , und legen Sie die NuGet.config für die Paketquellen relevant für diese Lösungen in diesem gemeinsamen Verzeichnis gewährleistet, dass jede Lösung Ordner für bestimmte Projekte , die aren ‚t diese Paketquellen zu verwenden , die nicht in diesem gemeinsamen Ordner enthält.

BenAlabaster
quelle
31
Danke BenAlabaster. Wenn Sie es einfach halten möchten, können Sie einfach eine Datei haben, die nur <?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="MyCompanyPackageSource" value="\\server\NuGet\MyCompany" /> </packageSources> </configuration>
Folgendes
13
Möglicherweise müssen Sie Visual Studio schließen und erneut öffnen, damit diese Änderungen wirksam werden. Ich habe versucht, meine Lösung zu schließen, und das war nicht genug.
Jess
1
Eine gute Antwort wäre besser, wenn die Beispielkonfiguration auf das reduziert würde, was benötigt wird. Außerdem habe ich es mit VS2015 versucht und @Jess 'Kommentar scheint nicht mehr zuzutreffen. Beim erneuten Öffnen der Lösung wurde die neue Paketquelle für mich ausgewählt.
Danio
5

Ich möchte die hervorragende Antwort von BenAlabaster ergänzen . Ich hatte etwas das gegenteilige Problem:

Das Unternehmen hat seinen benutzerdefinierten privaten Nuget-Feed global für die Verwendung in allen Lösungen standardmäßig konfiguriert, und ich wollte mithilfe des öffentlichen Nuget-Feeds eine "Prototyp" -App erstellen .

Damit (im Verzeichnis dieser Lösung) ist der öffentliche Nuget-Feed nur für meine spezifische Lösung verfügbar, während der Feed des Unternehmens der Standard für alle anderen Lösungen bleibt:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <!-- Ditch all eventually upwards configured (private) feeds from an (enterprise) environment -->
    <clear />
    <!-- Make sure we use the public nuget -->
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
  <bindingRedirects>
    <add key="skip" value="False" />
  </bindingRedirects>
  <disabledPackageSources>
    <!-- Ditch all eventually upwards configured (private) feeds from an (enterprise) environment -->
    <clear />
  </disabledPackageSources>
</configuration>

Der Schlüssel bestand darin, alle nach oben deaktivierten Feeds zu löschen , da sie den öffentlichen Feed in ihrer NuGet.config in% APPDATA% \ NuGet absichtlich deaktiviert haben.

Marcel
quelle