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


我有一个.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语言功能。

事实上,在添加发布标志之前,使用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目录中了 解决  另一个问题

<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文件,即使它没有明显的需要它!


12067
2018-04-21 18:01


起源



答案:


只是把它放在这里,因为我花了两天时间试图解决同样的问题(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


9
2017-08-12 01:40



更新到1.0.8修复了问题 - renatotkr


答案:


只是把它放在这里,因为我花了两天时间试图解决同样的问题(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


9
2017-08-12 01:40



更新到1.0.8修复了问题 - renatotkr


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

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


7
2018-04-21 22:20



我希望有更好的东西,但你的解决方法对我有用。 - Conrad Frix
如果您在Razor代码中使用C#6功能,那么这不是一个真正的选择。有没有人找到不同的选择? - Basim
我试图理解我是否需要这个Roslyn编译器。我有一个.NET WebAPI2项目,它似乎默认包含它。但是,我的CI进程(使用BitBucket管道)使用MONO并且它抛出此错误:“构建目标IncludeRoslynCompilerFilesToItemGroup时出错:已添加项目。键入字典:'链接'键被添加:'链接'”。我删除它们,我的API项目工作正常(我使用Angular2,而不是MVC))。我不完全明白为什么我需要它或者这是一个好的举动...... - Rodney
简单版本:我在问题中提到的NuGet依赖关系(Microsoft.Net.Compilers)用于允许运行Visual Studio 2013的人员编译C#6代码。如果您的团队中没有人在使用VS 2013的Windows主机上构建,您可能不需要它。新编译器包含在VS 2015及更高版本中。 - jonnybot
你有没有找到一个实际的解决方案?我不想无法更新我的项目。 - Schoof