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



我有一个.NET MVC项目,我正在尝试使用Jenkins进行部署。

我一直让 Jenkins 运行 msbuild,然后使用 RoboCopy 复制生成的文件。我想切换到仅使用发布配置文件。发布配置文件在使用Visual Studio的本地计算机上运行良好,但在Jenkins主机上使用msbuild失败。

它给出的错误是

ASPNETCOMPILER : error 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>\myserversomesharemysite</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)packagesMicrosoft.Net.Compilers.1.1.1tools*" Exclude="$(SolutionDir)packagesMicrosoft.Net.Compilers.1.1.1tools*.sys" />
  </ItemGroup>
  <MakeDir Directories="$(WebProjectOutputDir)binroslyn" />
  <MakeDir Directories="$(WebProjectOutputDir)obj$(Configuration)AspnetCompileMergeSourcebinroslyn" />
  <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)binroslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
  <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)obj$(Configuration)AspnetCompileMergeSourcebinroslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>

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

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

<EnableUpdateable>False</EnableUpdateable>

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

在本地运行 msBuild

我可以在本地计算机上成功运行 msbuild 命令。它部署到服务器和所有内容。这是我在Powershell中运行的命令:

&"C:Program Files (x86)MSBuild14.0BinMSBuild.exe" /p:Configuration=Debug "/p:DeployOnBuild=true;PublishProfile=MyProfile" myprojectmyproject.csproj

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

突然想到,也许我不再需要这些语句将 roslyn 编译器复制到 bin 文件夹,因为 msbuild14 现在在 Jenkins 上可用(我不确定是我第一次构建项目时)。可悲的是,发生了同样的错误。它正在寻找 roslyn\csc.exe 文件,即使它显然不需要这样做!

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

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

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

所以是的,我在VS2017和VS2019以及Microsoft.CodeDom.Providers.DotNetCompilerPlatform 2.0.1中也有这个问题。做了很多麻烦msbuild并深入挖掘并尝试做我自己的解决方法和构建文件中的更改,这些更改什么也没做,但这似乎根本不对。所以我开始寻找不同的方向。

发现我无法直接构建.csproj,也无法让 nuget 目标Microsoft.CodeDom.Providers.DotNetCompilerPlatformmsbuild 运行,或者我自己的自定义目标。

但是,将msbuild与目标为myproj:Rebuild.sln一起使用可以使一切正常。

相关内容

  • 没有找到相关文章

最新更新