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。经过一番研究,我发现了以下内容:

External VS2013 build error "error MSB4019: The imported project <path> was not found" 得票最多的人谈到从.csproj 中删除&lt;PropertyGroup&gt; 节点,删除它后,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 中正确构建/发布项目的主要内容,如果未能解决你的问题,请参考以下文章

MVC是啥?

MVC详解:mvc是什么?为什么要用MVC?MVC工作原理以及MVC优缺点

从MVC框架看MVC架构的设计

asp.net(mvc) 如何知道mvc版本

深入理解MVC

t4mvc,无法解析符号“MVC”