web-dev-qa-db-fra.com

Est-il possible de définir les paramètres NuGet Package Source par solution?

Est-ce que quelqu'un connaît un moyen de faire en sorte que Visual Studio applique la configuration des sources de paquets NuGet par solution plutôt que dans toutes les solutions? Je continue à avoir des problèmes de gestion de version car je travaille sur plusieurs projets ayant chacun leur propre référentiel privé NuGet. Il est difficile de se rappeler le référentiel NuGet correspondant à chaque projet et de revenir en arrière et d'appliquer le bon au bon projet.

62
BenAlabaster

TLDR: oui

NuGet utilise une application hiérarchique des sources de paquets commençant par NuGet.config au niveau de votre profil utilisateur Windows, puis appliquant une configuration de plus en plus granulaire à partir de la racine du chemin du fichier contenant votre solution, pour finir par le répertoire contenant votre fichier de solution.

Alors voici ce que j'ai réussi à comprendre - grâce à un Twitterer utile qui m'a dirigé vers ce document:

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

Lorsque vous modifiez les sources du package NuGet dans l'option Tools > NuGet Package Manager > Package Manager Settings: Package Sources De Visual Studio, il applique ces modifications par défaut au fichier NuGet.config se trouvant dans votre répertoire %APPDATA%\NuGet. Pour remplacer ces paramètres par solution (ou par groupe de solutions), vous devez ajouter un fichier NuGet.config stratégiquement placé quelque part sur le chemin de votre solution ou de vos solutions.

Tout deviendra clair si vous lisez le document NuGet. La solution que je vous donne ci-dessous vous permettra rapidement de spécifier une configuration pour une solution Visual Studio unique:

  1. Accédez à% APPDATA%\NuGet et récupérez une copie de NuGet.config.
  2. Déposez une copie à la racine de votre solution, c’est-à-dire où réside Application.sln.
  3. Remplacez les valeurs par défaut appliquées à votre profil utilisateur en modifiant la copie afin qu'elle ne contienne que les sources de packages NuGet pertinentes pour cette solution - par exemple, la source privée NuGet contenant des packages propriétaires pour cette solution, mais ne devrait pas être appliquée à d'autres projets. - par exemple:
<?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>

Si vous souhaitez qu'une configuration s'applique à plusieurs solutions, assurez-vous que vos dossiers de solution sont tous contenus dans un répertoire commun et placez NuGet.config pour les sources de paquetages pertinentes pour ces solutions dans ce répertoire commun, en veillant à ce que tous les dossiers de solution des projets ne sont pas pour utiliser ces sources de paquets ne sont pas contenues dans ce dossier commun.

111
BenAlabaster

Je souhaite ajouter à l'excellente réponse fournie par BenAlabaster. J'ai eu un peu le problème inverse:

La société a globalement configuré son flux de nuget privé personnalisé pour une utilisation sur toutes les solutions par défaut, et je souhaitais créer une application "prototype" à l'aide du flux de nuget public .

Avec cela (dans le répertoire de cette solution), le flux de pépites public est uniquement disponible pour ma solution spécifique, tout en conservant le flux de l'entreprise comme base par défaut pour toutes les autres solutions:

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

La clé consistait à effacer tous les flux désactivés vers le haut, car ils ont délibérément désactivé le flux public dans leur NuGet.config dans% APPDATA%\NuGet.

3
Marcel