SpecsFor MVC / MSBuild.exe 无法在 Visual Studio 2012 中正确构建/发布项目
Posted
技术标签:
【中文标题】SpecsFor MVC / MSBuild.exe 无法在 Visual Studio 2012 中正确构建/发布项目【英文标题】:SpecsFor MVC / MSBuild.exe not building / publishing project correctly in Visual Studio 2012 【发布时间】:2014-07-18 11:42:40 【问题描述】:我正在尝试使用 SpecsFor MVC 进行自动化验收测试,我注意到它没有在 Visual Studio 2012 上正确构建/发布项目,因此 IIS Express 没有运行,以“无法显示页面”消息结尾在整个自动化验收测试中。
为了让您完成我的所有测试以使其正常工作,最初,在尝试运行自动化测试时,我在运行时收到“构建失败”消息
_host = new SpecsForIntegrationHost(config);
_host.Start();
。加载 SpecsFor MVC 源代码后,我注意到错误是因为 MSBuild.exe
进程失败并且输出消息正在写入 Console.Output
。检查输出后,我注意到错误是找不到Microsoft.WebApplication.targets
。经过一番研究,我发现了以下内容:
.csproj
中删除<PropertyGroup>
节点,删除它后,MSBuild.exe
没有以错误代码退出,因为它只有警告,这仍然导致项目不正确构建和发布。在这种情况下,SpecsFor MVC 将此方案视为成功并继续启动 IIS Express,但由于项目未成功构建,验收测试导致另一个 Page Cannot Be Displayed
消息,因为 IIS Express 未正确运行。
经过进一步研究,我发现v11.0\WebApplications\Microsoft.WebApplication.targets was not found when file actually references v10 概述了VS 2012 在C:\Program Files (x86)\MSBuild\12.0\Bin
中有一个新的不同的MSBuild.exe 文件。
现在的问题是在 SpecsFor MVC IISTestRunnerAction.PublishSite()
方法中,MSBuild.exe
的路径正在通过
System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
在我的情况下输出 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
。手动将其更改为 C:\Program Files (x86)\MSBuild\12.0\Bin
解决了问题,项目已成功构建和发布。
我的最后一个问题是:有没有一种方法可以更改 System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
的值,这样我就不需要更新 SpecsFor MVC 项目的源代码了?
提前感谢您的帮助!
【问题讨论】:
我认为覆盖 SpecsFor MVC 如何找到 MSBuild 是最好的解决方案。我可以公开一种明确设置路径的方法。你能在 Github 上打开一个错误报告或功能请求,以便我记得查看这个吗? @MattHoneycutt - 在github.com/MattHoneycutt/SpecsFor/issues/41 上报告的问题 - 非常感谢您的帮助! :) 【参考方案1】:从 SpecsFor.Mvc 3.2.0-rc01(目前仍是预览版)开始,您可以像这样配置 MSBuild 的路径:
var config = new SpecsForMvcConfig();
config.UseIISExpress()
.With(Project.Named("SpecsFor.Mvc.Demo"))
.CleanupPublishedFiles()
//Set the full path to MSBuild.exe here!
.UseMSBuildExecutableAt(@"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe")
.ApplyWebConfigTransformForConfig("Test");
【讨论】:
感谢您的及时帮助@Matt Honeycutt! :)【参考方案2】:要了解这些“.targets”文件在 Visual Studio 中的组织方式是一项挑战。我对这个 SpecsFor MVC 的工作一无所知,但如果你把正确的“.targets”文件放在它的路径中,它应该可以工作。根据您的问题,我了解 SpecsFor 在内部调用 MSBuild。
安装新的构建机器时也会出现类似的问题,并且缺少很多 Visual Studio 组件。并非所有这些都与框架一起部署。有些带有 Visual Studio 分离的安装程序,有些带有特定的组件。
我没有找到部署此所需文件的特定安装程序。刚刚找到了MSBuild 2012安装程序(http://www.microsoft.com/en-us/download/details.aspx?id=40760),不知道是不是部署了之前的版本.targets。
您也可以尝试针对您的特定版本的 ASP.NET MVC 安装程序。
另一种方法是尝试在 SpecsFor 中查找参数以查看它正在调用的 MSBuild 版本。可能如果它使用 Program Files\v12 中的版本,它应该可以工作。
【讨论】:
是的,如果它使用C:\Program Files (x86)\MSBuild\12.0\Bin
中的新 VS 2012 MSBuild,它可以正常工作。但它正在通过System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
读取MSBuild 的路径,在我的情况下返回C:\Windows\Microsoft.NET\Framework64\v4.0.30319` which when executed outputs the
.targets` 错误
对不起,我没有回答你的问题。我认为有两种方法:1)查找并安装部署所需 .targets 文件的正确包(我打赌在某些 ASP.NET MVC 包中)或 2)更改 SpecFlow 以接受不同的 MSBuild 路径。既然是开源项目,那么 Pull Request 呢?
我会说 2. 如果没有替代方法来更改 System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
的结果输出,那将更有意义。我已经联系了项目的创建者以获取反馈,然后将查看 Pull Request
是的。这是一个很好的选择。这种合作总是很有趣。我认为你的问题没有免费的午餐。我看不出有什么不同的方法。以上是关于SpecsFor MVC / MSBuild.exe 无法在 Visual Studio 2012 中正确构建/发布项目的主要内容,如果未能解决你的问题,请参考以下文章