¿Incorporar paquetes de NuGet en el control de versiones?

87

Antes de NuGet, era una "práctica recomendada" comúnmente aceptada registrar todas las DLL externas utilizadas en un proyecto. Normalmente en un directorio Libso 3rdParty.

Cuando trabaje con NuGet, ¿se supone que debo registrar el packagesdirectorio o hay alguna forma de que MSBuild descargue automáticamente los paquetes necesarios de la fuente de nuget?

Scott Weinstein
fuente
2
La respuesta a esto es cuestión de opinión. El campo "excluir / No" sostiene que debido a que el conjunto de características proporcionado hace que sea fácil durante el desarrollo y la compilación extraer del repositorio de paquetes (por ejemplo, nuget.org), se puede hacer en el momento de la compilación. El campo "incluir / Sí" sostiene que el código no se compilaría sin los paquetes si el repositorio externo no estuviera disponible. Lea ambos lados antes de tomar una decisión. Consulte también: softwareengineering.stackexchange.com/questions/301547/…
CJBS

Respuestas:

68

No

Dado que se hizo esta pregunta, ahora hay un flujo de trabajo fácil para usar NuGet sin comprometer paquetes al control de código fuente

Desde la consola de su administrador de paquetes, necesita instalar 'NuGetPowerTools' :

Install-Package NuGetPowerTools

Luego, para permitir que sus proyectos admitan la restauración del paquete, debe ejecutar otro comando:

Enable-PackageRestore

Ahora está listo para enviar su código base sin la carpeta de paquetes. El comando anterior cambió los archivos de su proyecto para que, si faltan paquetes, se descarguen y agreguen automáticamente.

Fuente

Usar NuGet sin enviar paquetes al control de código fuente

Edward Wilde
fuente
41
A partir de NuGet-1.6, ya no necesita NuGetPowerTools para hacer esto. Simplemente haga clic en la solución en el Explorador de soluciones y seleccione, Enable NuGet Package Restore. Consulte los documentos .
Kaleb Pederson
3
Sí, debe registrar la carpeta .nuget y los archivos que se encuentran debajo.
absynce
11
@Edward - Filosóficamente, ¿por qué no incluiría paquetes NuGet en el control de código fuente dado que son dependencias? Lo que se registra en el control de código fuente debe ser el 100% del código suficiente para una compilación. Al no incluir paquetes de NuGet, se crean dependencias externas, por ejemplo. ¿Qué pasa si la ubicación de descarga del paquete cambia, o por alguna extraña razón ya no está disponible, etc. O más probablemente, qué sucede si hay algún pequeño cambio en el paquete que luego se vuelve a descargar y rompe la compilación? Eso se habría evitado si todo lo necesario para construir el proyecto estuviera en control de código fuente.
Howiecamp
5
@Howiecamp No podría estar más de acuerdo. No entiendo la lógica. Quiero que el control de fuente sea un sistema completamente autónomo. Especialmente si el proyecto es algo heredado y no se accede a él por un tiempo. Quiero volver y que funcione sin modificaciones. Nuget es un punto único de falla que no quiero tener.
Telavian
2
@Howiecamp Nuestra solución es alojar nuestro propio servidor nuget y colocar todos los paquetes nuget, tanto internos como externos, en GIT-LFS. Esto elimina el único punto de falla y mantiene todo perfectamente bajo control de versiones. Pero todavía no comprobamos la carpeta de paquetes, y todavía usamos la restauración automática de paquetes
Casper Leon Nielsen
30

Si. Considere que el directorio "paquetes" es equivalente a su directorio "libs" que mencionó en su pregunta. Este es el enfoque que adopto personalmente con mis proyectos de OSS.

Estamos investigando características que permitirían a MSBuild descargar automáticamente los paquetes necesarios, pero eso no se ha implementado (a partir de NuGet 1.1).

Creo que es posible que algunas personas ya hayan implementado estas funciones por su cuenta, pero nuestro plan es tener esa función integrada en NuGet 1.2 o 1.3 con suerte.

Pirateado
fuente
10
Definitivamente me gustaría ver esa función agregada. Sería bueno poder tener paquetes desplegados según sea necesario en un servidor CI o una PC de desarrollo, de modo que pueda evitar sobrecargar el repositorio de control de código fuente con DLL de terceros.
John Mills
2
Si el administrador de paquetes en Visual Studio y la herramienta de línea de comandos pudieran "reparar paquetes", sería fantástico.
Shaun Wilson
1
Quizás sería bueno eliminar / editar esta respuesta ahora que está obsoleta
Lex
3
@Tim respuesta no es actual en mi humilde opinión
Edward Wilde
4
Esta respuesta sigue vigente. Considere los paquetes que no están en el repositorio global (no hay forma de repararlos / descargarlos). En mi humilde opinión, es una buena práctica almacenar paquetes en el sistema de control de versiones.
Pavel Hodek
6

A pesar de todas las respuestas aquí, sigue siendo una sencilla y horrible solución no tener todas sus dependencias bajo "algún tipo" de control de versiones.

Para GIT, esto significaría GIT-LFS.

El episodio reciente con NPM muestra por qué: si el repositorio de Internet del que depende se rompe, no está disponible, etc., entonces está jodido, ¿no es así?

Ya no puede construir sus cosas y, por lo tanto, no puede entregarlas.

Casper Leon Nielsen
fuente
1
Este es un punto MUY bueno. Incluso si tenemos nuestro propio servidor NuGet interno, ¿podemos confiar en que estará siempre disponible durante la compilación? Además, ¿con qué frecuencia cambian nuestros paquetes y siempre necesitaríamos obtener una copia nueva para cada compilación?
Josh P
npmse rompió porque no eliminó los paquetes, en realidad los eliminó. NuGet no hace esto; si en algún momento no puede acceder a NuGet, algo está terriblemente mal. No creo que almacenar una craptonne de dependencias en git sea una buena solución: simplemente bloquea tus dependencias en una versión específica y ten un espejo entre tú y en Internet si eso te importa.
Dan
2
"NuGet no hace esto". Bueno, hudiluhu, acabas de hacer promesas para el futuro de un dominio que está completamente fuera de tu control. En el mundo real, las cosas están fuera de su área de control, bueno, están fuera de su área de control. Esto se aplica tanto a NuGet como a Npm. Además, su idea de un "espejo" es exactamente lo que propongo aquí, pero en su mundo el "espejo" no está respaldado por ningún tipo de esquema controlado por versiones. Una vez más, no ha resuelto el problema que se propuso.
Casper Leon Nielsen
5

Desde que hice la pregunta, he aplicado el siguiente enfoque para no tener que registrarme en el directorio Toplovel Packages .

En un archivo build.msbuild de nivel superior:

<Target Name="NuGet">
    <ItemGroup>
       <NuGetPackage Include="*\packages.config" />
    </ItemGroup>
    <Exec Command='libs\NuGet.exe install "%(NuGetPackage.FullPath)" -o Packages'  />

    <!-- optional for project that has JavaScript content -->
    <CreateItem Include="Packages\*\Content\Scripts\*">
       <Output TaskParameter="Include" ItemName="NuGetJSFiles"/>
    </CreateItem>
    <Copy SourceFiles="@(NuGetJSFiles)" DestinationFolder="MainProj\Scripts\" OverwriteReadOnlyFiles="true" SkipUnchngedFiles="true" />
    <Delete Files="MainProj\Scripts\.gitignore" />
    <WriteLinesToFile File="MainProj\Scripts\.gitignore" Lines="%(NuGetJSFiles.Filename)%(NuGetJSFiles.Extension)" /
    <Delete Files="@(PostNuGetFiles)" />
</Target>

En cada archivo project.csproj

<Target Name="BeforeBuild">
    <Error Condition="!Exists('..\Packages\')" Text="You must run &gt; msbuild build.msbuild to download required NuGet
Packages" />

    <!-- optional for project that has JavaScript content -->
   <ReadLinesFromFile File="Scripts\.gitignore">
     <Output TaskParameter="Lines" ItemName="ReqJSFiles" />
   </ReadLinesFromFile>
   <Message Text="@(ReqJSFiles)" />
   <Error Condition="!Exists('Scripts\%(ReqJSFiles.Identity)')" Text="You must run &gt; msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
 </Target>
Scott Weinstein
fuente
2
Esto funciona, pero en estos días, es mejor usar la restauración del paquete de habilitación incorporado
Scott Weinstein
4

Me doy cuenta de que la realidad era diferente cuando esta pregunta se publicó y se respondió originalmente, pero afortunadamente la respuesta cambió un poco. Ahora es posible usar NuGet para descargar dependencias a través de MSBuild mediante un evento de precompilación. No es necesario que coloque la carpeta de paquetes en su repositorio de código, todas las dependencias se descargarán y / o actualizarán en la compilación. Puede que sea una solución, pero parece bastante decente. Consulte la siguiente publicación del blog para obtener más detalles: http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html

Pawel Krakowiak
fuente
4
Estaba emocionado hasta que recordé que esto requiere que el servidor de compilación acceda al repositorio de NuGet, y este no es el único lugar en el que he trabajado donde los servidores de compilación no pueden ver Internet. Volveré a revisar el árbol de paquetes en ...
piers7
3

Esta publicación se ha vuelto muy desactualizada. La respuesta sigue siendo NO, pero la solución ha cambiado. A partir de NuGet 2.7+, puede habilitar la restauración automática de paquetes sin incluir el archivo NuGet.exe en su fuente (esto es indeseable por decir lo menos) y si usa cualquier DVCS moderno, puede ignorar la carpeta de paquetes. Si necesita personalizaciones especiales, puede crear un archivo nuget.config en la raíz de la solución.

http://docs.nuget.org/docs/reference/package-restore

Además, con el nuevo formato csproj también puede evitar los archivos nuget.config adicionales, ya que ahora está integrado. Consulte esta publicación que lo explica mejor:

¿Debería agregarse la carpeta .nuget al control de versiones?

Jeremy
fuente