"Resolví" (trabajo creado alrededor) esto de una manera más simple.
En la compilación posterior
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
es la carpeta donde desea que se coloquen las cosas publicadas
NOTA: 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 por Release|x86
separado. Así que contabilicé ambos. Pero para admitir el dotnet publish
comando de compilación posterior , primero agregué RuntimeIdentifier
al archivo del proyecto.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>
¿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
if not exist "$(ProjectDir)obj\$(ConfigurationName)" mkdir "$(ProjectDir)obj\$(ConfigurationName)"
xcopy "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)" "$(ProjectDir)obj\$(ConfigurationName)" /E /R /Y
if $(ConfigurationName) == Release (
dotnet publish "$(ProjectFileName)" --runtime win-$(PlatformName) --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
) else (
dotnet publish "$(ProjectFileName)" --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
)
xcopy "$(ProjectDir)pub\my3rdPartyCompany.*.dll" "$(OutDir)" /Y /R
Explicación: dotnet publish está buscando obj\Debug
o obj\Release
. No lo tenemos durante la compilación porque la compilación crea obj\x64\Release
o obj\x86\Release
. Las líneas 1 y 2 mitigan este problema. En la línea 3 le digo dotnet.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.
dotnet publish
sería un truco? Incluya el comando en su archivo csproj como un script de compilación posterior.