コピー&ペーストするときに数回*.cshtml
ファイル、何らかの理由でVisualStudioセットBuild Action
これらのファイルで「なし」になる:
ファイルが存在するため、ローカルで作業している場合はこれを検出できません。ただし、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 ...>
_を使用することもできます
次のスニペットのいずれかをプロジェクトファイルに手動で配置する必要があります。
私を始めてくれてありがとう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>
タグの直前。
まあ、@ jessehouwingは確かに私のために働いた!その修正は私の.csproj
ファイルにうまく残ります:)....ただ、私はちょうど再確認しました、そしてそのニーススニペットが別の開発者か何かのマージのために先月どこかに消えたように見えます。 。 (実話)
とにかく、私はNPMモジュールについて言及したいと思います check-vs-includes 私はこれのために作成しました。 Node がインストールされている開発者にとっては特に便利です(インストールされていない場合は、おそらく:))。
ビルドごとではなく、デプロイする前に手動でチェックを実行します。ただし、マージによって.csprojファイルから消える(気付かない)可能性は低くなります。
ただし、このNPMパッケージを使用する主な利点は、Build Action NONEをチェックするだけでなく、プロジェクトにまったく含まれていないファイルもチェックすることです。 VisualStudioのWebDeployを使用すると、(微妙ではあるが厄介な)バグが発生する可能性もあるためです。また、インクルードが欠落している可能性が実際に高いのは、1)チームにVS以外の開発者が1人いる場合、または2).csprojファイルのマージが原因である場合(マージの問題が発生することが多い)です。
手順については、NPMページを確認してください。しかし、以下の簡単な例では、Node and Gulp:
Nodeモジュールをインストールします
npm icheck-vs-includes
gulpfile.js
にタスクを追加します:
var checkVSIncludes = require( 'check-vs-includes'); ... gulp.task( 'checkVSIncludes'、 function(){ checkVSIncludes(['/ Views/**/*。cshtml'、 '/ app/**/*。js']); });
.csproj
ファイルがある場所)gulp checkVSIncludes
カスタムビルドタスクを実装することをお勧めします。 msbuild/tfsスクリプトのプリビルドで呼び出します。カスタムビルドタスクは、ビルドアクションがないcshtmlのインクルードファイルがある場合、.scprojファイルをチェックする必要があります。そのため、終了してゼロ以外のint値を返します。