MVC 5 - 预编译视图仅适用于命令提示符
Posted
技术标签:
【中文标题】MVC 5 - 预编译视图仅适用于命令提示符【英文标题】:MVC 5 - Precompiling views only works from the command prompt 【发布时间】:2017-12-19 21:32:30 【问题描述】:我有一个奇怪的问题,希望有人可以帮助我。我有一台新笔记本电脑,我正在尝试在新机器上发布相同的 ASP.NET MVC 5 项目,并带有预编译的视图。但是,当我使用“发布期间预编译”选项进行发布时,它不会创建预编译视图。现在,如果我复制它运行的确切命令并在命令提示符中运行它,就会创建预编译视图。
这里是详细信息。两台机器都有带有 Visual Studio 2013 Update 5 的 Windows 10 周年更新(版本 1607)。在旧机器上使用相同的发布配置文件发布应用程序会生成预编译视图。在新机器上,“Publish Web”对话框的发布运行没有错误,但不会生成预编译视图。然后,我将这个确切的命令复制到 VS 用于预编译的命令提示符中:
C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p C:\MyApp\obj\Release\AspnetCompileMerge\Source -c C:\MyApp\obj\Release\AspnetCompileMerge\TempBuildDir
当我运行它时,它在TempBuildDir\bin
目录中创建了预编译视图!
我能想到的机器之间的唯一区别是 Windows 更新。
有什么想法吗?谢谢。
【问题讨论】:
您可以选择发布设置来预编译应用程序。选择文件夹发布时,发布 -> 设置 -> 文件发布选项 -> 在发布期间选择预编译。 @txfun 我已经设置好了。同样,它可以在一台机器上运行,而不能在另一台机器上运行。相同的设置。 您是否保存并将发布设置推送到您的存储库中? @txfun 是的,我是。感谢您的帮助。 【参考方案1】:我遇到了完全相同的问题。
这可能是压缩文件夹的问题(驱动器未压缩,但个别文件夹已压缩)。由于某种原因,.compiled 文件根本没有生成。
这仍然适用于 VS2019 和 MVC5。 (目前最新的工具链。可能是 .NET Framework 问题,与 VS 和 MsBuild 版本无关)。
这个帖子帮我找到了解决方案(见最后一个答案): https://social.msdn.microsoft.com/Forums/vstudio/en-US/cb6a4239-9765-4021-a7ab-e5ad3d8aef06/missing-compiled-files-when-publishing-an-aspnet-mvc-4-project-to-filesystem-on-tfs-build-server?forum=msbuild
【讨论】:
【参考方案2】:你使用的是 x64 版本的 Windows 吗?
您也可以尝试手动设置 $(AspnetCompilerPath):
msbuild.exe /p:AspnetCompilerPath="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe"
或将其添加到您的项目中:
<PropertyGroup>
<AspnetCompilerPath Condition=" '$(AspnetCompilerPath)'=='' " >C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe</AspnetCompilerPath>
</PropertyGroup>
我做了这个假设,因为Microsoft.Web.Publishing.AspNetCompileMerge.targets
文件包含字符串:
We can't use the in-place aspnet_compiler because it will output to the aspnet temp folder which is only suiteable to run on the current machine.
【讨论】:
我使用的是 64 位 Windows 10,但正在编译一个 32 位混合模式 MVC 5 应用程序。不幸的是,添加AspnetCompilerPath
属性并没有解决问题,仍然没有预编译 Web 部署包 zip 文件中的视图。手动运行 msbuild 也没有预编译它。以上是关于MVC 5 - 预编译视图仅适用于命令提示符的主要内容,如果未能解决你的问题,请参考以下文章
播放预编译命令仅在预编译文件夹中生成一个类文件,而不为控制器、模型等生成类文件