我有一个.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.DotNetCompilerPlatform
由 msbuild
运行,或者我自己的自定义目标。
但是,将msbuild
与目标为myproj:Rebuild
的.sln
一起使用可以使一切正常。