roslyn编译器没有使用msbuild复制到AspnetCompileMerge文件夹

jon*_*bot 12 c# msbuild visual-studio jenkins

我有一个.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包来引入C#编译器,因为项目中的一些协作者仍在Visual Studio 2013上,但我们在项目中使用了C#6语言功能.

事实上,在添加发布标志之前,项目在jenkins上使用MSBuild构建得很好.它只是在添加/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>
Run Code Online (Sandbox Code Playgroud)

我到目前为止所做的一切

我试过更新编译器包.

手动复制编译器

我在.csproj文件中添加了步骤,将丢失的编译器文件强制复制到AspnetCompileMerge目录(我已经将它们复制到bin\roslyn目录以解决 另一个问题)

<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>
Run Code Online (Sandbox Code Playgroud)

关闭发布配置文件中的可更新性

根据Wesley Rathburn对类似问题的回答,我尝试制作预编译的网站,以便在发布配置文件中无法更新:

<EnableUpdateable>False</EnableUpdateable>
Run Code Online (Sandbox Code Playgroud)

虽然这揭示了我的视图中需要删除的一些死代码,但它并没有在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
Run Code Online (Sandbox Code Playgroud)

删除完全复制编译器的语句

在我看来,我可能不再需要语句将roslyn编译器复制到bin文件夹,因为msbuild14现在可以在Jenkins上使用(我不确定它是在我第一次构建项目时).可悲的是,发生了同样的错误.它正在寻找roslyn\csc.exe文件,即使它没有明显需要它!

par*_*ity 9

只是把它放在这里,因为我花了两天时间试图解决同样的问题(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/13https://github.com/dotnet/roslyn/issues/21340

  • 更新到1.0.8修复了问题 (2认同)

jon*_*bot 7

因此,我现在使用的解决方法(我并不完全喜欢)只是删除CompilersCodeDOM Compilers包的依赖项.我还必须清除.csproj和web.config文件中的引用.这涉及从共享程序集中删除这些包.

这将打破人们仍然使用Visual Studio 2013,这是我不喜欢的项目,但它建立我的詹金斯主机现在,我喜欢.如果有人有更好的解决方案,我会很高兴听到它.

  • 如果您在Razor代码中使用C#6功能,那么这不是一个真正的选择.有人找到了不同的选择吗? (2认同)