当前位置: 首页 > 知识库问答 >
问题:

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

方承弼
2023-03-14

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

问题是,在我添加发布标志之前,在 jenkins 上使用 MSBuild 构建的项目很好。只是因为添加了 /p:DeployOnBuild=true;发布配置文件=我的配置文件设置它开始失败...但是发布步骤在Visual Studio中工作正常,roslyn编译器甚至被复制到我本地机器上的obj\Debug\AspnetCompileMerge\Source\bin\文件夹中。什么给?

老实说,由于msBuild14在Jenkins服务器上可用,它可能甚至不需要roslyncsc.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>

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

<EnableUpdateable>False</EnableUpdateable>

尽管这揭示了一些需要在我的视图中删除的死代码,但它并没有修复jenkins构建期间的错误。

我可以在本地计算机上成功运行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 文件,即使它显然不需要这样做!

共有3个答案

秦禄
2023-03-14

是的,我对VS2017也有这个问题

我发现我无法构建<代码>。csproj,并在Microsoft.CodeDom.Providers中具有nuget目标。DotNetCompilerPlatformmsbuild或我自己的自定义版本运行。

但是,使用<code>msbuild</code>和<code>。目标为myproj:Rebuild的sln使一切正常。

汲昊空
2023-03-14

所以,我现在使用的解决方法(我并不完全喜欢),只是去除对编译器和CodeDOM编译器包的依赖。我还必须清除。csproj和web.config文件。这也包括从共享程序集中删除那些包。

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

岳昊空
2023-03-14

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

 类似资料:
  • 问题内容: 我有一个要使用Jenkins部署的.NET MVC项目。 我一直在让Jenkins运行msbuild,然后使用RoboCopy将结果文件复制出来。我想切换为仅使用发布个人资料。发布配置文件在使用Visual Studio的本地计算机上运行正常,但是在Jenkins主机上,使用msbuild失败。 它给出的错误是 ASPNETCOMPILER:错误ASPRUNTIME:找不到路径“ C:

  • 我最近刚刚深入研究了Roslyn编译器的东西,我想知道一些可能性。我正在尝试使用分支从Roslyn存储库构建Roslyn编译器,并替换文件夹中所需的DLL。但是当我替换DLL并构建控制台应用程序项目时,我收到了以下错误消息 严重性代码描述项目文件行抑制状态 错误无法运行指定的任务可执行文件“csc.exe”。无法加载文件或程序集Microsoft.CodeAnalysis.CSharp、Versi

  • 在Visual Studio 2017中,当点击<kbd>Ctrl</kbd><kbd<F5</kbd>运行我的ASP时。NET Framework Web API服务器,我得到: 在包管理器控制台中运行并不是永久的修复,因为当包文件丢失时,服务器错误会再次出现。我如何一劳永逸地摆脱此错误,以便在我重新打开、构建和运行我的Visual Studio解决方案时自动(默默地)重新安装所需的包? 重现错

  • 概述 编译选项可以在使用MSBuild的项目里通过MSBuild属性指定。 例子 <PropertyGroup Condition="'$(Configuration)' == 'Debug'"> <TypeScriptRemoveComments>false</TypeScriptRemoveComments> <TypeScriptSourceMap>true</TypeS

  • 在Visual Studio 2017中,当单击Ctrl+F5运行我的ASP.NET Framework Web API服务器时,我会得到: 找不到文件...bin\Roslyn\csc.exe: 在包管理器控制台中运行并不是永久性的修复,因为当包文件丢失时,服务器错误会再次出现。如何才能一劳永逸地消除此错误,以便在重新打开、生成和运行Visual Studio解决方案时立即自动(以静默方式)重新

  • 问题内容: 有没有办法编译一个node.js应用程序? 问题答案: 我可能已经很晚了,但是您可以使用“ nexe”模块在一个可执行文件中编译nodejs +您的脚本:https : //github.com/crcn/nexe