Estoy tratando de escribir un sistema de complementos con .NET Core, y uno de mis requisitos es poder distribuir la DLL del complemento junto con sus dependencias al usuario para su instalación.
Sin embargo, no puedo averiguar cómo incluir mis dependencias de NuGet como un artefacto de compilación y hacer que se envíen a la carpeta de compilación, sin tener que usarlas dotnet publish
como un truco. ¿Hay alguna forma de que pueda especificar esto en el archivo .csproj (archivo de proyecto)?
dotnet publish
sería un truco? Incluya el comando en su archivo csproj como un script de compilación posterior.dotnet publish
arroja todo el marco en la carpeta de publicación, ya que estoy escribiendo un complemento, la mayoría de los archivos no son necesarios ya que el programa de arranque ya cargaría el marco. Estoy buscando algo similar a cómo funcionan las compilaciones en .NET Framework.<CopyToOutputDirectory>Always</CopyToOutputDirectory>
en su csproj en cada una de las DLL que desea mover no funciona? ¿Quizás combinado con un<link>
nodo?<PackageReference/>
no es compatible<CopyToOutputDirectory>
.Respuestas:
Puede agregar esto
<PropertyGroup>
dentro de su archivo csproj para hacer cumplir la copia de ensamblados NuGet en la salida de la compilación:Sin embargo, tenga en cuenta que
bin/Release/netcoreapp*/*
se supone que la salida de la compilación ( ) no es portátil y distribuible, la salida de sí lodotnet publish
es. Pero en su caso, copiar los ensamblados en el resultado de la compilación probablemente sea muy útil para realizar pruebas. Pero tenga en cuenta que también puede usar laDependencyContext
API para resolver las DLL y sus ubicaciones que son parte del gráfico de dependencia de la aplicación en lugar de enumerar un directorio local.fuente
DependencyContext
? ¿Cómo puedo usarlo para encontrar una DLL que no está en el directorio de la aplicación? ¿Dónde está de todos modos?Puede utilizar PostBuildEvent para automatizar la implementación del módulo en la compilación.
Para obtener los ensamblados de NuGet en la carpeta de compilación, agregue csproj de su módulo
Defina qué archivos de módulo desea donde use Incluir / Excluir (modifique la ruta según sea necesario)
Restablezca su carpeta de compilación a la predeterminada y agregue PostbuildEvent
Incluyo app_offline para reciclar la aplicación si ya se está ejecutando para evitar errores de archivo en uso.
fuente
Añadiendo
no funcionó, pero agregando esto al archivo Framework .csproj:
hizo.
fuente
"Resolví" (trabajo creado alrededor) esto de una manera más simple.
En la compilación posterior
pub
es la carpeta donde desea que se coloquen las cosas publicadasNOTA: dependiendo de la versión
dotnet.exe
que utilice, es--no-build
posible que el comando no esté disponible.Por ejemplo, no disponible en v2.0.3; y disponible en v2.1.402. Sé que VS2017 Update4 tenía v2.0.3. Y Update8 tiene 2.1.x
Actualizar:
La configuración anterior funcionará en el entorno de depuración básico, pero para ponerla en el entorno de producción / servidor de compilación se necesita más. En este ejemplo en particular que tuve que resolver, lo construimos
Release|x64
y porRelease|x86
separado. Así que contabilicé ambos. Pero para admitir eldotnet publish
comando de compilación posterior , primero agreguéRuntimeIdentifier
al archivo del proyecto.¿Por qué lo necesitaba y por qué puedes escapar sin él? Necesitaba esto porque mi programa de compilación está configurado para interceptar la advertencia MSB3270 y fallar la compilación si aparece. Esta advertencia dice, "oye, algunos archivos de tus dependencias tienen un formato incorrecto". ¿Pero recuerdas el objetivo de este ejercicio? Necesitamos extraer las DLL de dependencia de paquetes. Y en muchos casos no importa si esta advertencia está ahí porque la siguiente compilación posterior no importa. Una vez más, este es mi programa de construcción que se preocupa. Entonces, solo agregué
RuntimeIdentifier
a 2 configuraciones que uso durante la compilación de producción.Construcción de publicación completa
Explicación: dotnet publish está buscando
obj\Debug
oobj\Release
. No lo tenemos durante la compilación porque la compilación creaobj\x64\Release
oobj\x86\Release
. Las líneas 1 y 2 mitigan este problema. En la línea 3 le digodotnet.exe
que use una configuración específica y un tiempo de ejecución de destino. De lo contrario, cuando este es el modo de depuración, no me importan las advertencias ni las cosas en tiempo de ejecución. Y en la última línea, simplemente tomo mis dlls y los copio en la carpeta de salida. Trabajo hecho.fuente
dotnet publish "$(ProjectFileName)" -c Release --no-build -o bin\pub
xcopy "$(ProjectDir)pub\PostSharp.dll" "$(OutDir)"
Junto con la respuesta anterior: tengo esto funcionando muy bien en la línea de comando del evento posterior a la compilación: en Visual Studio. Recorre una selección de archivos DLL (System * .dll y Microsoft .dll) * y luego omite la eliminación de archivos DLL específicos. System.Data.SqlClient.dll y System.Runtime.Loader.dll
fuente