У меня есть проект .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, хотя нет никакой очевидной необходимости в этом!