visual studio paquetes nuggets net microsoft c# deployment teamcity nuget symbol-server

c# - paquetes - nuget visual studio



¿Cómo depurar en mi paquete nuget implementado desde TeamCity? (9)

He puesto una biblioteca que mi equipo usa en un paquete nuget que se implementa desde TeamCity en una carpeta de red. ¡No puedo depurar en este código sin embargo! SymbolSource es una solución sobre la que he leído, pero preferiría encontrar alguna manera de tener acceso a los archivos .pdb / source directamente desde Teamcity. ¿Alguien sabe como hacer esto?

Editar. Cuando verifico ''Include Symbols and Source'' en el paso de compilación del paquete Nuget, TeamCity crea un .Symbol.nupkg además del archivo .nupkg en la carpeta de la red. El .Symbol.nupkg contiene el src y el archivo .pdb.

Editar. Sin marcar ''Include Symbols and Source'' en TeamCity y agregue lo siguiente a mi archivo nuspec:

<files> <file src="../MyLibrary/bin/release/MyLibrary.dll" target="lib/net40" /> <file src="../MyLibrary/bin/release/MyLibrary.pdb" target="lib/net40" /> <file src="../MyLibrary/*.cs" target="src" /> <file src="../MyLibrary/**/*.cs" target="src" /> </files>

Esto agregó la dll, el pdb y los archivos de origen de mi biblioteca en el paquete nuget y no generó un archivo .Symbols que creo que solo es necesario para los servidores de símbolos.


Solución ligera confiable

  1. Coloque el pdb en el paquete de NuGet junto con la dll.
  2. Agregue el código fuente a los archivos de origen de depuración para la solución que hace referencia al paquete.

Esto significa que podrá pasar por el código y ver las excepciones, pero es posible que tenga que encontrar un archivo en el disco y abrirlo antes de poder establecer un punto de interrupción. Obviamente, debe tener cuidado de que la fuente se encuentre en la revisión correcta.

Más detalles en el paso 1

Si actualmente está empaquetando sin un Nuspec, deberá crear un Nuspec, luego agregar el pdb a la lista de archivos en la carpeta lib. "NuGet spec" puede ser un comando útil para generar la especificación inicial como se define en NuGet. docs Luego, asegúrese de que el paso de Team City Nuget Pack hace referencia a su nueva nuspec.

Más detalles en el paso 2

Cuando tenga una solución abierta, haga clic con el botón derecho en Solución, seleccione Propiedades ... Propiedades comunes ... Depurar archivos de origen y agregue el directorio de origen raíz para la referencia binaria correspondiente. O vea MSDN . Tenga en cuenta que no puede abrir las propiedades de la solución mientras realiza la depuración.

En el futuro - incrustación de fuente

Desde Visual Studio 2017 15.5 preview2 puede agregar algo como esto a su archivo de proyecto:

<PropertyGroup> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <IncludeSymbolsInPackage>true</IncludeSymbolsInPackage> <DebugSymbols>true</DebugSymbols> <DebugType>portable</DebugType> <!-- Required for EmbedSources --> <EmbedSources>true</EmbedSources> </PropertyGroup> <ItemGroup> <!-- Does the equivalent of EmbedSources in MSBuild (hopefully won''t be needed long term) --> <Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" /> </ItemGroup>

Todavía es pronto para este método y es probable que haya algunas advertencias sobre su uso, consulte la parte inferior de este comentario y la discusión relacionada para obtener más información.


Desde que esta pregunta se publicó originalmente, Jetbrains ha escrito una publicación completa en el blog sobre cómo lograr esto. Los pasos se pueden resumir como:

Si está utilizando los pasos de compilación del paquete Nuget, puede marcar ''Incluir símbolos y fuente'' para generar un .symbol.nupkg que contenga los PDB. Dependiendo de si el indexador de archivos de símbolos es lo suficientemente inteligente como para mirar dentro de este archivo o no, es posible que deba cambiar la extensión del archivo para que las cosas funcionen.

Los detalles completos se dan aquí: https://blog.jetbrains.com/teamcity/2015/02/setting-up-teamcity-as-symbol-and-source-server/


En su .nuspec (directamente bajo <package> ):

<files> <file src="bin/$configuration$/$id$.pdb" target="lib/net451/" /> </files>

(Cambia net451 a la plataforma que estás compilando)


Esto es lo que he encontrado para trabajar, pero probablemente no se requieren todos los pasos ...

Nota : esto no le permite depurar ambos, solo el paquete nuget o la solución en la que está instalado.

  1. Ejecutar Visual Studio como administrador
  2. Abra e inicie la aplicación host (aquella en la que instaló el paquete Nuget) sin depurar (Ctrl + F5)
  3. En la solución del paquete Nuget, asegúrese de que las Tools > Options > Debugging > General > "Require source files to exactly match the original version" NO estén marcados.
  4. Asegúrese de que "Enable just my code" NO esté marcado
  5. Agregue una nueva carpeta en Tools > Options > Debugging > Symbols apuntan al directorio de origen del paquete Nuget. (Usted ingresa literalmente la ruta de la carpeta, vea la imagen a continuación)
  6. Haga clic en Debug > Attach to Process...
  7. Encuentre iisexpress (puede haber múltiples, no hará ningún daño al adjuntar a todos)


He encontrado una forma súper simple de hacer esto, sobre la que he escrito aquí:

https://mattfrear.com/2017/11/29/speed-up-development-in-a-nuget-package-centric-solution/

Esto solo funciona si está utilizando el nuevo .csproj estilo Core con <PackageReference> (en .NET Core o .NET Framework).

De nuevo, esto supone que tiene acceso al código fuente del paquete NuGet.

  1. Construya y compile el paquete NuGet en su máquina local
  2. Copie el archivo .dll que acaba de compilar en su carpeta local de paquetes de NuGet (en mi máquina, este es C:/Users/matt/.nuget/packages/ ), sobrescribiendo el paquete existente de NuGet .dll.

¡Eso es! Debería poder ingresar al paquete mientras realiza la depuración. No pierdas el tiempo con .pdbs o servidores de origen. Esto ha acelerado enormemente mi ciclo de desarrollo.



Por supuesto , puede configurar y configurar su propio servidor de símbolos , pero probablemente sea más fácil ...

  1. descargar e instalar ProGet de ProGet
  2. habilitar el símbolo que sirve en el feed de destino
  3. Publicar paquetes de TeamCity en el feed de ProGet.
  4. use ProGet como su fuente principal de información (ya que puede agregar múltiples fuentes, incluyendo nuget.org)

Todo esto se puede hacer con la edición gratuita de ProGet.

descargo de responsabilidad - mi trabajo del día está en Inedo


Si su código está en un repositorio público de Git, o, al menos en su red, es accesible sin autenticación, entonces GitLink sería una opción:

https://github.com/GitTools/GitLink

GitLink hace que los servidores de símbolos queden obsoletos al cambiar el PDB para que apunte al servidor Git. Pero, como se dijo antes, esto hace que sea necesario que el repositorio de Git sea público, hasta ahora no hay una forma "adecuada" de autenticarse cuando se accede a un repositorio privado.


Si tiene el código fuente para el paquete, entonces el método a prueba de errores (pero posiblemente laborioso) es:

  1. Agregue el código fuente del paquete a su solución (haga clic con el botón derecho en Solución -> Agregar proyecto existente)
  2. Revise todos sus proyectos en la solución y elimine la referencia de NuGet a la biblioteca (es decir, abra la carpeta Referencias debajo de cada proyecto y elimine la referencia al paquete). Luego, agregue una referencia al proyecto del paquete de NuGet en su solución. (es decir, haga clic con el botón derecho en Referencias, agregue Referencia, elija Proyectos y marque la casilla para el proyecto)

Tuve que hacerlo de esta manera cuando el método y no el código llamaba al método que quería depurar dentro del paquete NuGet, por lo que no podía entrar en él. (En mi caso, el método fue un ASP.NET DelegatingHandler).

Una vez que haya terminado, querrá deshacer todos sus cambios a través del control de origen para que se haga referencia al paquete NuGet correctamente.