El compilador roslyn no se copió a la carpeta AspnetCompileMerge usando msbuild
Tengo un proyecto .NET MVC que estoy tratando de implementar con Jenkins.
Había estado dejando que Jenkins ejecutara msbuild, luego copié los archivos resultantes usando RoboCopy. Quería cambiar para usar solo un perfil de publicación. El perfil de publicación funciona bien en mi máquina local usando Visual Studio, pero en el host Jenkins falla usando msbuild.
El error que da es
ASPNETCOMPILER: error ASPRUNTIME: No se pudo encontrar una parte de la ruta 'C: \ Archivos de programa (x86) \ Jenkins \ jobs \ myProject \ workspace \ myProject \ obj \ Debug \ AspnetCompileMerge \ Source \ bin \ roslyn \ csc.exe'. [C: \ Archivos de programa (x86) \ Jenkins \ jobs \ myProject \ workspace \ myProject \ calendar.csproj]
Estoy usando elMicrosoft.Net.Compilers nuget package para extraer el compilador de C #, porque algunos de los colaboradores en el proyecto todavía están en Visual Studio 2013, pero estamos usando características de lenguaje C # 6 en el proyecto.
La cosa es que el proyecto se construyó bien utilizando MSBuild en jenkins antes de agregar el indicador de publicación. Es solo desde que agregué el/p:DeployOnBuild=true;PublishProfile=MyProfile
configurando que comenzó a fallar ... sin embargo, el paso de publicación funciona bien desde la visualización de Visual Studio, y el compilador de roslyn incluso se copia en la carpeta obj \ Debug \ AspnetCompileMerge \ Source \ bin \ en mi máquina local. ¿Lo que da?
Honestamente, dado que msbuild14 está disponible en el servidor Jenkins, probablemente ni siquieranecesitar el archivo roslyn csc.exe. ¿Hay alguna manera de hacer que msbuild lo ignore?
Mi perfil de publicación<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>FileSystem</WebPublishMethod>
<LastUsedBuildConfiguration>Debug</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<publishUrl>\\myserver\someshare\mysite</publishUrl>
<DeleteExistingFiles>True</DeleteExistingFiles>
<PrecompileBeforePublish>True</PrecompileBeforePublish>
<EnableUpdateable>True</EnableUpdateable>
<DebugSymbols>False</DebugSymbols>
<WDPMergeOption>DonotMerge</WDPMergeOption>
</PropertyGroup>
</Project>
Lo que he probado hasta ahoraHe intentado actualizar el paquete del compilador.
Copiar manualmente el compiladorAgregué pasos a mi archivo .csproj para forzar la copia de los archivos del compilador que faltan en el directorio AspnetCompileMerge (ya los había estado copiando en el directorio bin \ roslyn pararesolver otro problema)
<Target Name="CopyRoslynFiles" AfterTargets="BeforeBuild">
<ItemGroup>
<RoslynFiles Include="$(SolutionDir)packages\Microsoft.Net.Compilers.1.1.1\tools\*" Exclude="$(SolutionDir)packages\Microsoft.Net.Compilers.1.1.1\tools\*.sys" />
</ItemGroup>
<MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
<MakeDir Directories="$(WebProjectOutputDir)\obj\$(Configuration)\AspnetCompileMerge\Source\bin\roslyn" />
<Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
<Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\obj\$(Configuration)\AspnetCompileMerge\Source\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>
Desactivar la capacidad de actualización en el perfil de publicaciónBasado en la respuesta de Wesley Rathburn enuna pregunta similar, Intenté crear el sitio precompilado para que no se pudiera actualizar en el perfil de publicación:
<EnableUpdateable>False</EnableUpdateable>
Aunque esto reveló un código muerto que necesitaba eliminarse en mis vistas, no solucionó el error durante la compilación de jenkins.
Ejecutando MsBuild localmenteI puede Ejecute con éxito el comando msbuild en mi máquina local. Se implementa en el servidor y todo. Aquí está el comando que ejecuto en powershell:
&"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /p:Configuration=Debug "/p:DeployOnBuild=true;PublishProfile=MyProfile" myproject\myproject.csproj
Eliminar las declaraciones que copian el compilador por completoSe me ocurrió que tal vez ya no necesitaba las declaraciones para copiar el compilador de Roslyn a la carpeta bin, ya que msbuild14 estaba disponible en Jenkins ahora (y no estoy seguro de que fuera la primera vez que construí el proyecto). Lamentablemente, se produce el mismo error. Está buscando el archivo roslyn \ csc.exe, ¡aunque no hay necesidad aparente de que lo haga!