我有一个.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.Compilers nuget包来引入C#编译器,因为项目中的一些协作者仍然在Visual Studio 2013上,但我们在项目中使用C#6语言功能。
事实上,在添加发布标志之前,使用MSBuild在jenkins上构建的项目很好。它只是在添加之后 /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目录中了 解决 另一个问题)
<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>
关闭发布配置文件中的可更新性
根据韦斯利拉斯本的回答 一个类似的问题,我尝试制作预编译的网站,因此无法在发布配置文件中更新:
<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文件,即使它没有明显的需要它!