web-dev-qa-db-ja.com

すべての* .cshtmlファイルがビルドアクションの「コンテンツ」に設定されていることを確認してください

コピー&ペーストするときに数回*.cshtmlファイル、何らかの理由でVisualStudioセットBuild Actionこれらのファイルで「なし」になる: Comments.cshtml is set to be "None" on Build Action

ファイルが存在するため、ローカルで作業している場合はこれを検出できません。ただし、WebDeployを介してデプロイする場合、ビルドアクションで「なし」とマークされたファイルはパッケージ化されません。その結果、サーバー上で動作しないアプリケーションが発生します。

質問:そのような発生を自動的に検出して防止する方法はありますか?

33
trailmax

「なし」グループのアイテムの拡張子が_.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="&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 ...>_を使用することもできます

次のスニペットのいずれかをプロジェクトファイルに手動で配置する必要があります。

enter image description here

30
jessehouwing

私を始めてくれてありがとう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>

Csprojファイルの</Project>タグの直前。

4
Jacob Brewer

まあ、@ jessehouwingは確かに私のために働いた!その修正は私の.csprojファイルにうまく残ります:)....ただ、私はちょうど再確認しました、そしてそのニーススニペットが別の開発者か何かのマージのために先月どこかに消えたように見えます。 。 (実話)

NPMの代替

とにかく、私はNPMモジュールについて言及したいと思います check-vs-includes 私はこれのために作成しました。 Node がインストールされている開発者にとっては特に便利です(インストールされていない場合は、おそらく:))。

ビルドごとではなく、デプロイする前に手動でチェックを実行します。ただし、マージによって.csprojファイルから消える(気付かない)可能性は低くなります。

ただし、このNPMパッケージを使用する主な利点は、Build Action NONEをチェックするだけでなく、プロジェクトにまったく含まれていないファイルもチェックすることです。 VisualStudioのWebDeployを使用すると、(微妙ではあるが厄介な)バグが発生する可能性もあるためです。また、インクルードが欠落している可能性が実際に高いのは、1)チームにVS以外の開発者が1人いる場合、または2).csprojファイルのマージが原因である場合(マージの問題が発生することが多い)です。

手順については、NPMページを確認してください。しかし、以下の簡単な例では、Node and Gulp:

簡単な例

  1. Nodeモジュールをインストールします

    npm icheck-vs-includes

  2. gulpfile.jsにタスクを追加します:

 var checkVSIncludes = require( 'check-vs-includes'); 
 
 ... 
 
 gulp.task( 'checkVSIncludes'、 function(){
 checkVSIncludes(['/ Views/**/*。cshtml'、 '/ app/**/*。js']); 
}); 
  1. プロジェクトフォルダでチェックを実行します(たとえば、.csprojファイルがある場所)

    gulp checkVSIncludes

3
Bart

カスタムビルドタスクを実装することをお勧めします。 msbuild/tfsスクリプトのプリビルドで呼び出します。カスタムビルドタスクは、ビルドアクションがないcshtmlのインクルードファイルがある場合、.scprojファイルをチェックする必要があります。そのため、終了してゼロ以外のint値を返します。

0
Miloš Cigoj