¿Hay alguna forma de realizar la configuración de origen del paquete NuGet por solución?

83

¿Alguien conoce alguna forma de hacer que Visual Studio aplique la configuración de las fuentes del paquete NuGet por solución en lugar de en todas las soluciones? Sigo teniendo problemas de control de versiones porque trabajo en varios proyectos, cada uno de los cuales tiene sus propios repositorios privados de NuGet. Es un dolor de cabeza seguir recordando qué repositorio de NuGet pertenece a qué proyecto y volver atrás y aplicar el correcto al proyecto correcto.

BenAlabaster
fuente
No estoy seguro de lo que quieres decir. Solo puede configurar las fuentes del paquete nuget para todas las soluciones. Su archivo package.config contendrá las versiones de los repositorios nuget que su proyecto necesita. No actualice automáticamente. ¿Puede dar un ejemplo de lo que quiere hacer?
Shyamal Desai
1
@Shyamal Estaba hablando de las fuentes del paquete NuGet, no de los paquetes en sí ... Descubrí cómo hacerlo.
BenAlabaster

Respuestas:

136

TLDR: sí

NuGet usa una aplicación jerárquica de fuentes de paquetes que comienza con NuGet.config en el nivel de su perfil de usuario de Windows y luego aplica una configuración cada vez más granular comenzando en la raíz de la ruta del archivo que contiene su solución, finalmente terminando con el directorio que contiene su archivo de solución.

Así que esto es lo que he logrado averiguar, cortesía de un Twitterer útil que me indicó este documento:

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

Cuando edita las fuentes del paquete NuGet en la Tools > NuGet Package Manager > Package Manager Settings: Package Sourcesopción de Visual Studio , aplica esos cambios de forma predeterminada al archivo NuGet.config que se encuentra en su %APPDATA%\NuGetdirectorio. Para anular esta configuración por solución (o por grupo de soluciones), debe agregar un archivo NuGet.config ubicado estratégicamente en algún lugar a lo largo de la ruta de su solución o soluciones.

Todo quedará claro si lee el documento de NuGet, la solución que proporciono a continuación le permitirá especificar rápidamente una configuración para una única solución de Visual Studio:

  1. Vaya a% APPDATA% \ NuGet y obtenga una copia de NuGet.config
  2. Vierta una copia en la raíz de su solución, es decir, donde reside Application.sln.
  3. Anule los valores predeterminados aplicados a su perfil de usuario editando la copia para que contenga solo las fuentes del paquete NuGet que son relevantes para esta solución, por ejemplo, la fuente privada NuGet que contiene paquetes propietarios para esta solución, pero que no debe aplicarse a otros proyectos. - por ejemplo:
<?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 desea una configuración que se aplica a múltiples soluciones, asegurar sus carpetas de soluciones están todas contenidas dentro de un directorio común y puso el NuGet.config de las fuentes de paquetes relevantes para esas soluciones en ese directorio común, asegurando que todas las carpetas de soluciones para proyectos que aren 't de usar estas fuentes de paquetes no están contenidos en esta carpeta común.

BenAlabaster
fuente
28
Gracias BenAlabaster. Si solo desea mantenerlo simple, puede tener un archivo que contenga solo:<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="MyCompanyPackageSource" value="\\server\NuGet\MyCompany" /> </packageSources> </configuration>
Rubenisme
13
Puede que tenga que cerrar y volver a abrir Visual Studio para que estos cambios surtan efecto. Intenté cerrar mi solución y eso no fue suficiente.
Jess
1
buena respuesta, sería mejor si la configuración de ejemplo se redujera a lo que se necesitaba. También probé con VS2015 y el comentario de @Jess ya no parece aplicarse, reabrir la solución recogió la nueva fuente del paquete para mí.
danio
5

Quiero sumarme a la excelente respuesta proporcionada por BenAlabaster . Tuve algo el problema opuesto:

La empresa configuró globalmente su feed nuget privado personalizado para usarlo en todas las soluciones de forma predeterminada, y yo quería crear una aplicación "prototipo" utilizando el feed nuget público .

Con esto (en el directorio de esa solución), el feed nuget público está disponible solo para mi solución específica, mientras que el feed de la empresa es el predeterminado para todas las demás soluciones:

<?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 clave fue borrar todos los feeds deshabilitados hacia arriba , ya que deshabilitaron deliberadamente el feed público en su NuGet.config en% APPDATA% \ NuGet.

Marcel
fuente