我想要一个msbuild任务来编译视图,这样我就可以在编译时看到是否有编译时错误。 有任何建议吗?
我想要一个msbuild任务来编译视图,这样我就可以在编译时看到是否有编译时错误。 有任何建议吗?
来自 RC1 的自述文档(Google 不可索引)
ASP.NET 编译器后置构建步骤
目前,在视图文件中出现的错误直到运行时才被检测到。为了让你在编译时便能检测到这些错误,ASP.NET MVC 项目现在包含了一个 MvcBuildViews 属性,默认情况下是禁用的。要启用此属性,请打开项目文件并将 MvcBuildViews 属性设置为 true,如以下示例所示:
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>
注意:启用此功能会增加构建时间的开销。
您可以通过执行以下步骤,将使用先前版本的 MVC 创建的项目更新为包括视图构建时验证:
<PropertyGroup>
元素下添加以下元素:
<MvcBuildViews>true</MvcBuildViews>
<Target Name="AfterBuild">
元素,并将其修改为以下内容:<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
</Target>
我个人会推荐使用RazorGenerator nuget包。这样,当你保存视图时,它们就会生成一个 .designer.cs
文件,在获取视图的编译时错误的同时,它们也会被预编译到程序集中(=更快的热启动),而且Resharper还提供了一些额外的帮助。
要使用这个方法,请在ASP.NET MVC项目中包含RazorGenerator nuget包,并在工具→扩展和更新项下安装“Razor Generator”扩展。
我们使用这个方法,每次编译的开销都要小得多。此外,我可能还会推荐使用RedGate的.NET Demon来进一步减少编译时间的影响。
你可以使用 aspnet_compiler 来实现此功能:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler -v /Virtual/Application/Path/Or/Path/In/IIS/Metabase -p C:\Path\To\Your\WebProject -f -errorstack C:\Where\To\Put\Compiled\Site
其中"/Virtual/Application/Path/Or/Path/In/IIS/Metabase"是类似于"/MyApp"或"/lm/w3svc2/1/root/"这样的东西。
此外,MSDN上还有一个AspNetCompiler任务,展示了如何将aspnet_compiler与MSBuild集成:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="PrecompileWeb">
<AspNetCompiler
VirtualPath="/MyWebSite"
PhysicalPath="c:\inetpub\wwwroot\MyWebSite\"
TargetPath="c:\precompiledweb\MyWebSite\"
Force="true"
Debug="true"
/>
</Target>
</Project>
此外,如果你使用 Resharper,你可以激活“解决方案宽度分析”,它可以检测出在 aspx 文件中可能存在的任何编译器错误。这就是我们所做的...
生成 > 运行代码分析
快捷键: Alt+F11
帮助我发现 Razor 错误。
Solution Error Visualizer
功能。使用它,编译错误在解决方案资源管理器中以视觉方式标记(在找到错误的源文件中)。但出于某种原因,在代码的其他任何地方,此功能都无法正常工作。
对于MVC视图,任何编译时错误仍将在其各自的.cs文件中用红色下划线标出,但不会向上传播这些错误至解决方案资源管理器(甚至不在包含源文件中)。
感谢BlueClouds
更正我的先前声明。
我刚刚在扩展的github项目上报告了这个问题。
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);
BuildMvcViews;
</BuildDependsOn>
<BuildMvcViewsCacheFile>$(IntermediateOutputPath)$(MSBuildProjectFile).BuildMvcViews.cache</BuildMvcViewsCacheFile>
</PropertyGroup>
<ItemGroup>
<BuildMvcViewsInputs Include="$(ProjectDir)Views\**\*.cshtml"></BuildMvcViewsInputs>
</ItemGroup>
<Target Name="BuildMvcViews" Inputs="@(BuildMvcViewsInputs)" Outputs="$(BuildMvcViewsCacheFile)">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)" Condition="'@(BuildMvcViewsInputs)' != ''"/>
<WriteLinesToFile
File="$(BuildMvcViewsCacheFile)"
Lines=""
Overwrite="true"
Condition="'@(BuildMvcViewsInputs)' != ''"/>
</Target>
<PropertyGroup>
<CleanDependsOn>
$(CleanDependsOn);
CleanBuildMvcViewsCacheFile;
</CleanDependsOn>
</PropertyGroup>
<Target Name="CleanBuildMvcViewsCacheFile">
<Delete Files="$(BuildMvcViewsCacheFile)" />
</Target>