【发布时间】: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