Compile el paquete NuGet automáticamente, incluidas las dependencias referenciadas

83

Quiero ejecutar un repositorio NuGet local / interno . Creo que he descubierto cómo "reutilizar" los paquetes NuGet existentes incluyéndolos en un proyecto ficticio usando NuGet y escaneando el archivo del paquete para capturar mis .nupkgarchivos almacenados en caché local , pero ...

¿Cómo se crea un paquete nuget ( .nupkg) a partir de un proyecto, que incluye automáticamente todas las dll dependencias y no solo las capturadas a través de NuGet?

Específicamente:

  1. Crea una solución
  2. Agregar un nuevo proyecto
  3. Agregue referencias a varios .dllarchivos / otros proyectos <- esta es la parte que falta
  4. Agregue paquetes NuGet a través del administrador de paquetes / cmdline / lo que sea
  5. algo crea automáticamente el.nupkg

Por lo que he encontrado, se supone que debes hacer cosas como

  • edite manualmente su .csprojarchivo para agregarlo <BuildPackage>true</BuildPackage>para incluir dependencias
  • cree manualmente un .nuspecarchivo y enumere manualmente sus dependencias ( ¿similar? )
  • ejecutar manualmente nuget packen su .nuspecarchivo

Pero todo es manual, lo cual es una estupidez. Incluso las soluciones semiautomáticas siguen siendo incómodas o medio manuales:

Me conformaré con algo que crea automáticamente un .nuspecmanifiesto a partir de las referencias del proyecto. Entonces, teóricamente, + el evento de compilación de nuget se puede acumular en un paquete de proyecto de compilación / nuget, que es lo que realmente quiero ver.

drzaus
fuente
Me acabo de encontrar con esta extensión VS eyecatch.no/projects/nuget-package-template que tendré que investigar ...
drzaus
3
Cinco años después, la especificación o el paquete nuget 4.x todavía no pueden determinar las dependencias.
StingyJack
¿Hay alguna actualización para este problema? ¿O todavía tienes estos problemas?
Dominic Jonas
Me di por vencido con esto hace un tiempo, pero echa un vistazo a NuProj según lo informado por esta respuesta
drzaus
Este problema aún existe. :(
BrainSlugs83

Respuestas:

75

Su punto # 3 ( Agregar referencias a varios archivos .dll / otros proyectos <- esta es la parte que falta ) realmente contiene dos problemas diferentes: (1) agregar referencias a varios archivos dll y (2) agregar referencias a otros proyectos en la misma solución.

El número (2) aquí ha recibido soporte adicional a partir de NuGet 2.5 . Puede agregar una opción para incluir referencias a otros proyectos en la misma solución al crear un paquete NuGet para un proyecto:

nuget pack projectfile.csproj -IncludeReferencedProjects

Si hace projectfile.csprojreferencia a otros proyectos de su solución que también se exponen como paquetes NuGet, los paquetes NuGet de estos proyectos se agregarán como dependencias. Si hace referencia a proyectos en su solución que no se exponen como paquetes NuGet, sus dlls se incluirán en este paquete NuGet.

En cuanto a (1), si a menudo agrega dlls a sus proyectos que no están disponibles como paquetes NuGet, puede crear sus propios paquetes NuGet (internos) con estos archivos. Si luego agrega estos dlls como un paquete NuGet en lugar de los archivos directamente, este paquete NuGet será una dependencia en el paquete NuGet de su proyecto.

Julian
fuente
3
suspiro # 1 todavía es demasiado manual para mi gusto. En realidad, "crear su propio paquete NuGet (interno) con estos archivos" es lo que estoy tratando de hacer; el objetivo de esta pregunta es que quiero acumular automáticamente .dlls que no sean NuGet en un paquete NuGet. No revise y enumere cada dll manualmente en una .nuspec, que creo que es lo que está sugiriendo.
drzaus
No tiene que especificar cada DLL por separado. De hecho, sería mucho trabajo si tuviera muchos de ellos. Cuando enumere los archivos para incluir, puede usar comodines (recursivos) ( docs.nuget.org/docs/reference/… ), por lo que si, por ejemplo, coloca todas estas DLL en una carpeta separada, sería una línea simple para incluir el centro comercial.
Juliano
Ah, ahora llego a donde vas, así que si hago un proyecto contenedor, incluyo referencias a través del habitual "proyecto de clic derecho> Agregar referencia", entonces puedo hacer un nuspecque incluya todo en el bindirectorio (asumiendo mis referencias son todos "copia local"), automáticamente recogerá todo lo que haya agregado. Parece un poco torpe, pero probablemente funcionaría.
drzaus
6
No recogerá automáticamente lo que esté en su directorio bin, tendría que especificarlo explícitamente, algo como esto:<file src="bin\release\*.dll" target="lib" />
Julian
2
Tenga en cuenta que si los proyectos a los que se hace referencia tienen un archivo nuspec, nuget lo tratará como un paquete y NO lo incluirá en la carpeta lib, pero lo agregará a las dependencias del paquete
workabyte
5

Para otros Googlers, puede usar esto si está usando el archivo NuGet.targets para ejecutar NuGet Pack:

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>
John Gietzen
fuente
7
Suena prometedor, pero no hay suficiente información para implementarlo. ¿Qué es este archivo NuGet.targets del que habla? Estoy familiarizado con la compilación de archivos de destino en general, pero no con este caso de uso específico
bikeman868
2

¡Mira esto!

La solución que encontré es una extensión para Visual Studio: https://visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96/view/Reviews

Simplemente agrega un nuevo proyecto llamado Paquete Nuget Paquete NuGet

Entonces estás agregando proyectos interesantes a las referencias y ¡¡BOOOM !! Todas las dependencias y directorios de archivos se agregan automáticamente. Si desea modificar los datos de NuSpec, haga clic derecho en el proyecto y vaya a Propiedades, luego modifique lo que desee. NuSpec y nupkg generados estarán en la carpeta obj de su nuevo proyecto. Espero que ayude ;).

Przemysław Kamiński
fuente
1
¿Existe también una solución para VS2017?
Dominic Jonas
Esto no funciona en caso de generar los paquetes en el servidor de compilación.
Michi-2142
Lástima que esto esté en desuso. Hubiera sido útil.
joelc
2

Encontré un artículo bien escrito sobre este tema. Tengo el mismo problema con ciertos paquetes que tienen una jerarquía de dependencias y hasta ahora he estado cargando cada uno como un paquete NuGet separado (lo que es una pérdida de tiempo).

Acabo de probar la solución que se encuentra aquí: https://dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p

Y después de examinar el paquete NuGet mediante el Explorador de paquetes NuGet, las DLL producidas por los proyectos referenciados están presentes. Voy a probar enviando este paquete a NuGet y probándolo.

Aquí está mi fuente en caso de que sea útil para usted: https://github.com/jchristn/NuGetPackTest

Y el paquete de prueba de NuGet: https://www.nuget.org/packages/NuGetPackTest/1.0.0

La solución parece funcionar bien. No sé cómo se verá cuando haya capas de referencias, estoy seguro de que podría volverse muy complicado y muy rápido.

ingrese la descripción de la imagen aquí

.csproj de la biblioteca NuGetPackTest que hace referencia al proyecto TestLibrary (partes eliminadas por brevedad)

<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>

    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
  
</Project>
joelc
fuente
1
esto resolvió mi problema de inmediato. Seguí las instrucciones como se menciona en el enlace y funcionó. Es bueno tener la esencia agregada también en su respuesta.
Jabez