Actualmente, empaqueto las compilaciones de la versión con Nuget para las compilaciones oficiales en nuget.org, pero empaqueto las compilaciones de depuración con Nuget para los empujes de la fuente de símbolos en symbolsource.org.
EDITAR: (Jon Skeet, con algún sesgo del desarrollo de Noda Time)
NuGet ahora admite la inserción tanto en la galería NuGet como en symbolsource.org (o servidores similares), como se documenta . Desafortunadamente, aquí hay dos requisitos contradictorios:
- Cuando solo usa una biblioteca sin necesidad de depurar, realmente desea una compilación de lanzamiento. Después de todo, para eso son las versiones de lanzamiento.
- Al depurar en una biblioteca con fines de diagnóstico, realmente desea una compilación de depuración con todas las optimizaciones apropiadas deshabilitadas. Después de todo, para eso son las compilaciones de depuración.
Eso estaría bien, pero NuGet (hasta donde yo sé) no permite que tanto la versión de lanzamiento como la versión de depuración se publiquen de una manera útil, en el mismo paquete.
Entonces, las opciones son:
- Distribuya las compilaciones de depuración a todos (como se muestra en el ejemplo en los documentos) y viva con cualquier tamaño y éxito de rendimiento.
- Distribuya las compilaciones de la versión a todos y viva con una experiencia de depuración ligeramente deteriorada.
- Opte por una política de distribución realmente complicada, que potencialmente proporcione paquetes de liberación y depuración separados.
Los dos primeros realmente se reducen al efecto de las diferencias entre las compilaciones de depuración y versión ... aunque vale la pena señalar que también hay una gran diferencia entre querer ingresar al código de una biblioteca porque desea verificar algún comportamiento y querer para depurar el código de una biblioteca porque cree que ha encontrado un error. En el segundo caso, probablemente sea mejor obtener el código de la biblioteca como una solución de Visual Studio y depurar de esa manera, por lo que no estoy prestando demasiada atención a esa situación.
Mi tentación es seguir con las compilaciones de la versión, con la expectativa de que relativamente pocas personas necesitarán depurar, y las que lo hagan no se verán afectadas mucho por las optimizaciones en la compilación de la versión. (El compilador JIT realiza la mayor parte de la optimización de todos modos).
Entonces, ¿hay otras opciones que no hayamos considerado? ¿Hay otras consideraciones que inclinan la balanza? ¿Enviar paquetes NuGet a SymbolSource es lo suficientemente nuevo como para que no se hayan establecido las "mejores prácticas"?
nuget pack ... -Symbol
y presionando los paquetes generados ...Respuestas:
Hablando en nombre de SymbolSource, creo que la mejor práctica es:
Ya que estamos en eso, es un error común pensar que las compilaciones de liberación y depuración en .NET realmente difieren mucho, pero supongo que la diferenciación está aquí debido a varios códigos que pueden o no estar incluidos en cualquiera de las compilaciones, como Debug .Afirma.
Dicho esto, realmente vale la pena enviar ambas configuraciones a SymbolSource, porque nunca se sabe cuándo necesitará depurar el código de producción. De forma remota en producción para hacerlo más difícil. Necesitará la ayuda que pueda obtener de sus herramientas cuando eso suceda. Lo que obviamente no le deseo a nadie.
Todavía hay una cuestión a considerar con respecto al control de versiones: ¿es correcto tener 2 paquetes diferentes (compilados en depuración y en versión) que compartan 1 número de versión? SymbolSource lo aceptaría, ya que extrae paquetes y almacena binarios en ramas de modo de compilación separadas, SI SÓLO NuGet tiene permitido etiquetar paquetes en consecuencia. Actualmente, no hay forma de determinar si un paquete está en modo de depuración o de liberación.
fuente
Debug.Assert
etc., pero ¿podría ampliar (en su respuesta) las implicaciones al depurar? ¿Qué tan malo es usar una versión de lanzamiento?Estoy completamente de acuerdo con tu conclusión. Paquetes NuGet con RELEASE y SymbolSource con depuración. Parece bastante raro entrar directamente en los paquetes y el paso en falso de depuración ocasional con optimizaciones habilitadas podría ser aceptable.
Si realmente hubiera un problema, creo que la solución ideal sería que NuGet lo admita. Por ejemplo, imagínese si al depurar, pudiera reemplazar la DLL de la versión con la incluida en el paquete SymbolSource.
Idealmente, lo que sucedería entonces es que
nuget pack SomePackage -Symbols
contra una versión de lanzamiento se crearía un paquete nuget de lanzamiento, pero un paquete de símbolos de depuración. Y el complemento VS se actualizaría para ser lo suficientemente inteligente como para ver la asociación y extraer los ensamblados de depuración cuando se ejecuta en un depurador y cargarlos en su lugar. Un poco loco, pero sería interesante.Sin embargo, no veo suficientes personas quejándose de esto como para que valga la pena en este momento.
El equipo de NuGet acepta solicitudes de extracción. :)
fuente
Han pasado 8 años desde la publicación de OP, así que lo intentaré con lo que se usa hoy en día.
Hay 2 formas de " entrar " en un paquete NuGet:
1. Distribución de AP
.symbols.nupkg
Los paquetes de símbolos se consideran heredados y se han reemplazado por.snupkg
paquetes que se publican en Symbol Server . Es compatible con todos los proveedores principales, como NuGet.org, Azure DevOps ( aunque menos fluido ), etc.Aquí están las instrucciones oficiales . Simplemente agregue estas dos líneas al archivo csproj:
En el lado del consumidor, asegúrese de que su IDE esté configurado para NuGet.org (o Azure, etc.) Symbol Server para permitir ingresar al código del paquete durante la depuración.
2. Enlace de origen: vincular el código real
En algunos casos, los PDB pueden ocultar algunos detalles del código fuente debido a la optimización de MSIL / JIT. Así que hay una manera de " entrar en " la fuente real de su NuGet durante la depuración. Se llama Source Link de .NET Foundation, " un sistema agnóstico de control de fuente y lenguaje para proporcionar experiencias de depuración de fuente para binarios ".
Es compatible con Visual Studio 15.3+ y todos los principales proveedores (también admite repositorios privados).
Es trivial de configurar ( documentos oficiales ): simplemente agregue una dependencia de desarrollo al archivo del proyecto (depende del tipo de su repositorio) junto con algunas banderas:
Obtenga más información sobre este tema en " 5 pasos para mejorar el paquete NuGet ".
fuente
El ejemplo de Creación y publicación de un paquete de símbolos hace referencia a los archivos de los directorios Debug como fuentes para los archivos dll y pdb.
Dado que el propósito de publicar los símbolos es permitir que otros revisen su código durante la depuración, parece más prudente publicar una versión del código destinada a la depuración sin optimizaciones que puedan afectar el paso del código.
fuente