Компилятор roslyn не скопирован в папку AspnetCompileMerge, используя msbuild

У меня есть проект .NET MVC, который я пытаюсь развернуть с помощью Jenkins.

Я позволил Jenkins запустить msbuild, а затем скопировал полученные файлы с помощью RoboCopy. Я хотел переключиться на использование профиля публикации. Профиль публикации отлично работает на моей локальной машине с помощью Visual Studio, но на узле Jenkins не работает msbuild.

Ошибка, которую он дает, это

ASPNETCOMPILER: ошибка ASPRUNTIME: не удалось найти часть пути 'C:\Program Files (x86)\Jenkins\jobs\myProject\workspace\myProject\obj\Debug\AspnetCompileMerge\Source\bin\roslyn\csc. Exe'. [C:\Program Files (x86)\Jenkins\jobs\myProject\workspace\myProject\calendar.csproj]

Я использую Microsoft.Net.Compilers пакет nuget, чтобы вытащить компилятор С#, потому что некоторые из соавторов проекта все еще на Visual Studio 2013, но мы используем возможности языка С# 6 в проекте.

Дело в том, что проект был построен отлично, используя MSBuild на jenkins, прежде чем добавить флаг публикации. Это только после добавления параметра /p:DeployOnBuild=true;PublishProfile=MyProfile, с которого он начал сбой... однако шаг публикации отлично работает с Visual Studio, и компилятор roslyn даже копируется в папку obj\Debug\AspnetCompileMerge\Source\bin\на моем локальном машина. Что дает?

Честно говоря, поскольку msbuild14 доступен на сервере Jenkins, ему, вероятно, даже не нужен файл roslyn csc.exe. Есть ли способ заставить msbuild игнорировать его?

Мой профиль публикации

<?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>

Что я пробовал до сих пор

Я пробовал обновить пакет компилятора.

Вручную компилятор

Я добавил шаги в свой файл .csproj, чтобы принудительно скопировать отсутствующие файлы компилятора в каталог AspnetCompileMerge (я уже копировал их в каталог bin\roslyn resolve еще одна проблема)

<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>

Отключение обновления в профиле публикации

Основываясь на ответе Уэсли Ратберна на аналогичный вопрос, я попытался сделать предварительно скомпилированный сайт, чтобы он не мог быть обновлен в профиле публикации:

<EnableUpdateable>False</EnableUpdateable>

Хотя это выявило какой-то мертвый код, который нужно удалить в моих представлениях, он не исправил ошибку во время сборки jenkins.

Запуск MsBuild локально

Я могу успешно запустить команду msbuild на моей локальной машине. Он развертывается на сервере и все такое. Здесь я запускаю команду powershell:

&"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /p:Configuration=Debug "/p:DeployOnBuild=true;PublishProfile=MyProfile" myproject\myproject.csproj

Удаление операторов, полностью копирующих компилятор

Мне пришло в голову, что, возможно, мне не нужны инструкции, чтобы скопировать компилятор roslyn в папку bin больше, поскольку msbuild14 теперь был доступен на Jenkins (и я не уверен, что это было, когда я впервые построил проект), К сожалению, такая же ошибка возникает. Он ищет файл roslyn\csc.exe, хотя нет никакой очевидной необходимости в этом!

Ответ 1

Итак, обходной путь, который я использую сейчас (что мне не совсем нравится), - это просто удалить зависимости Compilers и CodeDOM Compilers. Мне также пришлось очистить ссылки в файлах .csproj и web.config. Это также помогло удалить эти пакеты из общей сборки.

Это сломает проект для людей, все еще использующих Visual Studio 2013, которые мне не нравятся, но теперь он основывается на моем хосте Jenkins, который мне нравится. Если у кого-то будет лучшее решение, я был бы рад услышать это.

Ответ 2

Просто поместив это здесь, потому что я потратил два дня на то, чтобы решить эту же проблему (roslyn csc.exe не скопирован), но ни один из этих ответов не решил мою проблему.

Оказывается, Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.6 (и 1.0.7) сломан. Снизьте до 1.0.5.

Я получал те же ошибки, что и все остальные, но я использую VS 2017, и были повреждены как локальные WebDeploy, так и AzureDeploy (нет csc.exe). Я пробовал все предложения, которые я мог найти в Интернете (большинство из них перенаправлялось обратно на этот пост SO), но ничего не работало, пока я не понизился до 1.0.5.

Поэтому я надеюсь, что это полезно для всех, кто борется и недавно обновился до 1.0.6!

См: https://github.com/aspnet/RoslynCodeDomProvider/issues/13 а также https://github.com/dotnet/roslyn/issues/21340

Ответ 3

Так что да, у меня тоже есть эта проблема с VS2017 и VS2019 и Microsoft.CodeDom.Providers.DotNetCompilerPlatform 2.0.1. Я много работал над устранением неполадок в msbuild копал глубоко и пытался сделать мои собственные обходные пути и изменения в файле сборки, которые просто ничего не делали, но это не казалось правильным вообще. Поэтому я начал смотреть в другом направлении.

Я обнаружил, что не .csproj напрямую создать .csproj и у меня есть цели msbuild в Microsoft.CodeDom.Providers.DotNetCompilerPlatform запускаемые msbuild, или мои собственные.

Однако, используя msbuild с .sln с целью myproj:Rebuild все заработало.

Ответ 4

Я также сталкиваюсь с той же проблемой. Папка Roslyn не копируется. Можете ли вы помочь?

<Target Name="Build">
    <!-- Compile whole solution in release mode -->
    <MSBuild
        Projects="..\DemoWebsite.sln"
        Targets="Rebuild"
        Properties="Configuration=Release" />   </Target>
    <Target Name="PublishWebsite">
    <!-- Remove complete publish folder in order to 
             be sure that evrything will be newly compiled -->
    <Message Text="Removing publish directory: $(SetupF)"/>
    <RemoveDir Directories="$(SetupF)" ContinueOnError="false" />
    <Message Text="Start to publish website" Importance="high" />
    <MSBuild
        Projects="..\\DemoWebsite\DemoWebsite.csproj"
        Targets="ResolveReferences;_CopyWebApplication"
        Properties="OutDir=$(Publish)bin\;WebProjectOutputDir=
                        $(Publish);Configuration=Release" />   </Target>    <Target Name="Harvest">
    <!-- Harvest all content of published result -->
    <Exec
        Command='"$(WixPath)heat" dir $(Publish) -dr INSTALLFOLDER -ke -srd -cg MyWebWebComponents -var var.publishDir -gg -out $(WebSiteContentCode)'
        ContinueOnError="false"
        WorkingDirectory="." />   </Target>