O compilador roslyn não foi copiado para a pasta AspnetCompileMerge usando o msbuild
Eu tenho um projeto .NET MVC que estou tentando implantar usando o Jenkins.
Eu estava deixando Jenkins executar o msbuild e depois copiar os arquivos resultantes usando o RoboCopy. Eu queria mudar para usar apenas um perfil de publicação. O perfil de publicação funciona bem na minha máquina local usando o Visual Studio, mas no host Jenkins, ele falha ao usar o msbuild.
O erro que dá é
ASPNETCOMPILER: erro ASPRUNTIME: Não foi possível encontrar parte do caminho 'C: \ Arquivos de Programas (x86) \ Jenkins \ jobs \ meuProject \ espaço de trabalho \ meuProject \ obj \ Debug \ AspnetCompileMerge \ Source \ bin \ roslyn \ csc.exe'. [C: \ Arquivos de programas (x86) \ Jenkins \ jobs \ myProject \ workspace \ myProject \ calendar.csproj]
Estou usando oMicrosoft.Net.Compilers pacote nuget para atrair o compilador C #, porque alguns dos colaboradores do projeto ainda estão no Visual Studio 2013, mas estamos usando os recursos da linguagem C # 6 no projeto.
O problema é que o projeto foi desenvolvido usando o MSBuild no jenkins antes de adicionar o sinalizador de publicação. É só desde a adição do/p:DeployOnBuild=true;PublishProfile=MyProfile
definindo que começou a falhar ... mas a etapa de publicação funciona bem no Visual Studio, e o compilador roslyn é copiado para a pasta obj \ Debug \ AspnetCompileMerge \ Source \ bin \ na minha máquina local. O que da?
Honestamente, como o msbuild14 está disponível no servidor Jenkins, provavelmente nem sequernecessidade o arquivo roslyn csc.exe. Existe uma maneira que eu possa fazer msbuild ignorá-lo?
Meu perfil de publicação<?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>
O que eu tentei até agoraEu tentei atualizar o pacote do compilador.
Copiando manualmente o compiladorAdicionei etapas ao meu arquivo .csproj para copiar os arquivos do compilador ausentes no diretório AspnetCompileMerge (eu já os estava copiando no diretório bin \ roslyn pararesolver outro 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>
Desativando a capacidade de atualização no perfil de publicaçãoCom base na resposta de Wesley Rathburn emuma pergunta semelhante, Tentei criar o site pré-compilado para que não pudesse ser atualizado no perfil de publicação:
<EnableUpdateable>False</EnableUpdateable>
Embora isso tenha revelado algum código morto que precisava ser removido em minhas visualizações, ele não corrigiu o erro durante a compilação do jenkins.
Executando o MsBuild localmenteI pode execute com êxito o comando msbuild na minha máquina local. Ele implanta no servidor e tudo mais. Aqui está o comando que eu corro no PowerShell:
&"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /p:Configuration=Debug "/p:DeployOnBuild=true;PublishProfile=MyProfile" myproject\myproject.csproj
Removendo as Instruções que Copiam o Compilador InteiramenteOcorreu-me que talvez eu não precisasse mais das instruções para copiar o compilador roslyn para a pasta bin, pois o msbuild14 já estava disponível no Jenkins (e não tenho certeza se foi quando construí o projeto). Infelizmente, o mesmo erro ocorre. Ele está procurando o arquivo roslyn \ csc.exe, mesmo que não haja aparente necessidade de fazer isso!