确保所有*.cshtml文件都设置为Build Action的"Content"

tra*_*max 33 msbuild razor webdeploy visual-studio-2013 asp.net-mvc-5

有几次复制粘贴*.cshtml文件时,Visual Studio因某些原因将Build Action这些文件设置为"None": 在Build Action上,Comments.cshtml设置为

在本地工作时无法检测到,因为文件存在.但是,当您通过WebDeploy进行部署时,Build Action上标记为"None"的文件不会打包.结果我在服务器上得到了非工作应用程序.

问题:有没有办法自动检测此类事件并防止?

jes*_*ing 30

您可以.csproj使用一个小片段扩展它,当"无"组中的项目具有扩展名时,该片段将生成警告.cshtml.该片段将是:

<Target Name="EnsureContentOnViews" BeforeTargets="BeforeBuild">
  <ItemGroup>
    <Filtered Include="@(None)" Condition="'%(Extension)' == '.cshtml'" />
  </ItemGroup>
  <Warning 
    Condition="'@(Filtered)'!=''"
    Code="CSHTML" 
    File="$(MSBuildProjectDirectory)\%(Filtered.Identity)" 
    Text="View is not set to [BuildAction:Content]"
  />
</Target>
Run Code Online (Sandbox Code Playgroud)

如果您看到其他构建操作(例如EmbeddedResource),则可以将它们添加到Filtered项目定义中.

如果您想要更高级的检测,则需要实际解析适合此Xpath的任何项目的项目文件 //ItemGroup/*[not(self::Content)]/@Include

<Target Name="EnsureContentOnViewsXML" BeforeTargets="BeforeBuild">
  <XmlPeek XmlInputPath="$(MSBuildProjectFile)" Namespaces="&lt;Namespace Prefix='msb' Uri='schemas.microsoft.com/developer/msbuild/2003'/&gt;"; Query="/msb:Project/msb:ItemGroup/*[not(self::msb:EmbeddedResource)]/@Include">
    <Output TaskParameter="Result" ItemName="AllItems" />
  </XmlPeek>

  <!-- MsBuild uses XPath 1.0 which doesn't have the 'ends-with' or 'matches' function. -->
  <ItemGroup>
    <Filtered Include="@(AllItems)" Condition="'%(Extension)' == '.cshtml'" />
  </ItemGroup>

  <Warning 
    Code="CSHTML" 
    File="$(MSBuildProjectDirectory)\%(Filtered.Identity)" 
    Text="View is not set to [BuildAction:Content]"
    Condition="'@(Filtered)'!=''"
  />
</Target>
Run Code Online (Sandbox Code Playgroud)

而不是<Warning ...>你也可以使用<Error ...>

您需要手动将其中一个片段放入项目文件中:

在此输入图像描述


Jac*_*wer 5

感谢 jessehouwing 让我开始!我喜欢你的解决方案并投了赞成票。我遇到了一些麻烦,最终得到了以下结果:

<Target Name="EnsureContentOnViews" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <Filtered Include="@(None)" Condition="'%(Extension)' == '.cshtml'" />
    </ItemGroup>
    <Error Condition="'@(Filtered)'!=''" Code="CSHTML" File="%(Filtered.Filename)" Text="Not set to [BuildAction:Content]: Identity: %(Filtered.Identity)" />
</Target>
Run Code Online (Sandbox Code Playgroud)

就在</Project>csproj 文件中我的标签之前。