首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保所有*.cshtml文件都设置为构建操作的“内容”

确保所有*.cshtml文件都设置为构建操作的“内容”
EN

Stack Overflow用户
提问于 2015-01-14 23:17:57
回答 3查看 7K关注 0票数 34

在复制粘贴*.cshtml文件时,Visual出于某种原因将这些文件的Build Action设置为“无”:

当您在本地工作时,不可能检测到这一点,因为文件是存在的。但是,当您通过WebDeploy进行部署时,在Build上标记为"None“的文件不会打包。因此,我在服务器上得到了不工作的应用程序。

问:是否有一种方法可以自动检测和预防此类事件?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-15 18:51:01

您可以使用一个小片段扩展.csproj,当"None“组中的项具有扩展.cshtml时,该代码段将生成警告。片段将是:

代码语言:javascript
复制
<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>

如果看到其他构建操作(如EmbeddedResource),则可以将它们添加到筛选的项定义中。

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

代码语言:javascript
复制
<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>

您也可以使用<Warning ...>代替<Error ...>

您需要手动将这些片段中的一个放在项目文件中:

票数 32
EN

Stack Overflow用户

发布于 2016-03-01 17:21:53

谢谢你让我动心!我喜欢你的解决方案并投了赞成票。我在这件事上遇到了一点小麻烦,最后得到了以下结果:

代码语言:javascript
复制
<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>

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

票数 5
EN

Stack Overflow用户

发布于 2015-01-15 17:49:02

我建议实现一个自定义构建任务。在msbuild/tfs脚本中在预构建时调用它。如果存在包含cshtml的cshtml文件,则自定义构建任务应该只检查.scproj文件并没有生成操作。退出,返回一个非零的int值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27954267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档