【问题标题】:roslyn compiler not copied to AspnetCompileMerge folder using msbuildroslyn 编译器未使用 msbuild 复制到 AspnetCompileMerge 文件夹
【发布时间】:2016-08-15 02:25:34
【问题描述】:

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

我一直让 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>

到目前为止我已经尝试过什么

我已尝试更新编译器包。

手动复制编译器

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

<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 在 a similar question 上的回答,我尝试制作预编译网站,使其无法在发布配置文件中更新:

<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 文件,尽管它显然没有必要这样做!

【问题讨论】:

    标签: c# visual-studio jenkins msbuild


    【解决方案1】:

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

    【讨论】:

    • 更新到 1.0.8 解决了这个问题
    【解决方案2】:

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

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

    【讨论】:

    • 我希望有更好的东西,但你的解决方法确实对我有用。
    • 如果您在 Razor 代码中使用 C# 6 功能,这不是一个真正的选择。有没有人找到不同的选择?
    • 我想了解我是否需要这个 Roslyn 编译器。我有一个 .NET WebAPI2 项目,它似乎默认包含它。但是,我的 CI 流程(使用 BitBucket Pipelines)使用 MONO 并引发此错误:“Error building target IncludeRoslynCompilerFilesToItemGroup: Item has been added. Key in dictionary: 'Link' Key being added: 'Link'”。我删除了它们,我的 API 项目工作正常(我使用的是 Angular2,而不是 MVC))。我不完全理解我为什么需要它,或者这是一个好的举措......
    • 简单版:我在问题 (Microsoft.Net.Compilers) 中提到的 NuGet 依赖项用于允许运行 Visual Studio 2013 的人员编译 C# 6 代码。如果您的团队中没有人在使用 VS 2013 的 Windows 主机上进行构建,那么您可能不需要它。新编译器包含在 VS 2015 及更高版本中。
    • 您有没有找到实际的解决方案?我不想不能不更新我的项目。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 2010-09-12
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多