当我复制粘贴*.cshtml
文件几次时,Visual Studio由于某种原因将这些文件上的Build Action
设置为“None”:
由于存在文件,因此无法检测到何时在本地工作。但是,当您通过WebDeploy进行部署时,在“构建操作”上标记为“无”的文件将不会打包。结果,我在服务器上得到了无法正常工作的应用程序。
问题:有没有一种方法可以自动检测到这种情况并进行预防?
最佳答案
您可以使用一个小的代码段扩展.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>
如果看到其他构建操作(例如
EmbeddedResource
),则可以将它们添加到“过滤的项目”定义中。如果要进行更高级的检测,则需要实际解析项目文件中适合此Xpath
//ItemGroup/*[not(self::Content)]/@Include
的任何项目。<Target Name="EnsureContentOnViewsXML" BeforeTargets="BeforeBuild">
<XmlPeek XmlInputPath="$(MSBuildProjectFile)" Namespaces="<Namespace Prefix='msb' Uri='schemas.microsoft.com/developer/msbuild/2003'/>"; 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 ...>
您需要手动将以下片段之一放入您的项目文件中:
关于razor - 确保将所有* .cshtml文件设置为 “Content”进行构建操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27954267/