MVCBuildViews无法正常工作。
MVCBuildViews无法正常工作。
我在一个MVC 3 RTM应用程序的csproj文件中编辑,设置了以下属性:
这应该在构建过程中编译我的视图,并在视图出现错误时强制产生构建错误。这是我做的唯一修改,但是当我尝试构建应用程序时,出现以下错误:
在应用程序级别之外使用注册为allowDefinition='MachineToApplication'的部分是错误的。这个错误可能是由于IIS中的虚拟目录没有配置为应用程序引起的。
如果我改回false,项目会成功编译和运行。以下是在csproj文件中配置的构建任务(这些任务从未手动编辑过,它们是由Visual Studio 2010添加的):
我是否遗漏了什么?如何正确配置MVC 3 / Visual Studio 2010以在构建时验证我的视图?
问题的原因是在obj文件夹中有另一个web.config文件。可能是使用MSDeploy导致的,可以参考MSDN博客中的解决方法。另外,可能是某个工具生成了另一个web.config文件。
解决方法是在.proj文件中添加以下代码:<BaseIntermediateOutputPath>..\bin</BaseIntermediateOutputPath>
,这样obj文件夹就在解决方案级别,构建问题就解决了。
如果不想打开链接,可以直接在项目文件中的<MvcBuildViews>
下面添加<BaseIntermediateOutputPath>
元素。临时目录的名称可能更正确地命名为"obj"而不是"bin",但实际上并不重要。
如果从评论中复制代码,可能会出现一些奇怪的Unicode问题,导致开标签与闭标签不匹配,即使它们看起来是相同的。在"Path"中的"a"和"t"之间有一些不可见的字符。
这个问题出现的原因是obj文件夹中存在网页项目输出(模板化的web.config文件或临时发布文件)。ASP.NET编译器无法智能地忽略obj文件夹中的内容,因此会抛出错误。
解决方法之一是在调用<AspNetCompiler>之前清除发布输出。打开.csproj文件,将以下内容:
<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> </Target>
修改为:
<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<ItemGroup>
<ExtraWebConfigs Include="$(BaseIntermediateOutputPath)\**\web.config" />
<ExtraPackageTmp Include="$([System.IO.Directory]::GetDirectories("$(BaseIntermediateOutputPath)", "PackageTmp", System.IO.SearchOption.AllDirectories))" />
</ItemGroup>
<Delete Files="@(ExtraWebConfigs)" />
<RemoveDir Directories="@(ExtraPackageTmp)" />
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
这将删除\obj文件夹下的所有web.config文件,以及\obj文件夹下的所有PackageTmp文件夹。
更新:
根据https://stackoverflow.com/a/48582282/8037中的解决方法,你还可以完全排除obj文件夹。显然,<AspNetCompiler />
任务没有exclude参数,但如果你直接调用aspnet_compiler.exe,你可以这样排除obj文件夹:
<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> <Exec Command="$(MSBuildFrameworkToolsPath)aspnet_compiler.exe -v temp -p $(WebProjectOutputDir) -x $(BaseIntermediateOutputPath)"/> </Target>
这个解决方法对我也有效。我使用的是VS2013和MVC5。
或者,如果你愿意直接删除整个obj\Debug(或obj\Release)文件夹,在<AspNetCompiler>之前添加以下一行代码:<RemoveDir Directories="$(BaseIntermediateOutputPath)\$(Configuration)" />
<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> </Target>
这段代码导致我的编译工作只在第一次有效。浪费了很多时间等待重新编译。这个解决方法解决了我的问题。
问题出现的原因是<MvcBuildViews>true</MvcBuildViews>
这个设置会告诉Visual Studio在构建时编译视图,这个设置可能会导致在构建服务器上出现问题。
解决方法是删除obj/Debug文件夹或者进行项目清理。另外,可以参考Joe Cartano在stackoverflow上的回答,他提供了一个更持久的解决方案。
然而,有些人尝试了这些方法但并未成功,他们会尝试其他解决方案。
需要注意的是,每次重新启动VS2010时,都需要再次删除该文件夹,这是相对有效但不是持久的解决方法。因此,建议参考Joe Cartano在stackoverflow上的回答,他提供了一个更持久的解决方案。
具体的解决方案可以在stackoverflow上的这个链接找到:stackoverflow.com/questions/4725387/…