Parfois, lorsque je copie-colle des fichiers *.cshtml
, Visual Studio définit, pour une raison quelconque, Build Action
sur ces fichiers comme "Aucun":
Cela est impossible à détecter lorsque vous travaillez localement, car les fichiers sont présents. Mais lorsque vous déployez via WebDeploy, les fichiers marqués "Aucun" lors de l'action de génération ne sont pas fournis. En conséquence, je reçois une application qui ne fonctionne pas sur le serveur.
Question: existe-t-il un moyen de détecter automatiquement ce type d’événement et de le prévenir?
Vous pouvez étendre le .csproj
avec un petit extrait qui générera un avertissement lorsqu'un élément du groupe "Aucun" aura l'extension .cshtml
. L'extrait serait:
<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>
Si vous voyez d'autres actions de génération (telles que EmbeddedResource
), vous pouvez les ajouter à la définition d'élément filtré.
Si vous souhaitez une détection plus avancée, vous devez analyser les fichiers de projet pour tout élément correspondant à cette 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>
Au lieu de <Warning ...>
, vous pouvez également utiliser <Error ...>
Vous devez insérer manuellement l'un de ces extraits dans votre fichier de projet:
Merci jessehouwing de m'avoir lancé! J'ai aimé votre solution et voté pour elle. J'ai eu un petit problème avec et j'ai fini avec ce qui suit:
<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>
Juste avant ma balise </Project>
dans le fichier csproj.
Eh bien, @ jessehouwing a certainement fonctionné pour moi! Donc, ce correctif reste bien dans mon fichier .csproj
:) .... Seulement, je viens de double-vérifier et il semble que cet extrait de Nice ait disparu quelque part le mois dernier en raison de la fusion d'un autre développeur ou de quelque chose .. (histoire vraie )
Quoi qu'il en soit, je voudrais mentionner le module NPM check-vs-includes j'ai créé pour cela. C'est particulièrement pratique pour les développeurs qui ont Node installed (et si vous ne le faites pas, alors vous devriez probablement :)).
J'exécute la vérification manuellement avant chaque déploiement, au lieu de chaque génération. Mais il est moins susceptible de disparaître (inaperçu) de votre fichier .csproj en raison d'une fusion.
Cependant, le principal avantage de l'utilisation de ce package NPM réside dans le fait qu'en plus de rechercher l'action Construire NONE, il recherche également les fichiers non inclus dans votre projet. Cela peut également conduire à des bogues (subtils mais méchants) lorsque vous utilisez Web Deploy de Visual Studio. Et les inclus manquants sont en fait plutôt probables si: 1) vous avez 1 développeur non VS dans votre équipe, ou 2) en raison de la fusion du fichier .csproj (qui présente souvent des problèmes de fusion).
Consultez la page NPM pour obtenir des instructions. Mais ci-dessous un exemple simple, qui suppose que vous utilisez Node and Gulp:
Installer le module de nœud
npm i check-vs-includes
Ajouter une tâche à votre gulpfile.js
:
var checkVSIncludes = require ('check-vs-includes'); ... gulp.task ('checkVSIncludes', function () { checkVSIncludes (['/ Views/**/*. cshtml', '/app/**/*.js']); }))
.csproj
) gulp checkVSIncludes
Je suggère d'implémenter une tâche de construction personnalisée. Appelez-la lors de la pré-construction dans votre script msbuild/tfs. La tâche de construction personnalisée doit simplement vérifier le fichier .scproj s'il existe un fichier d'inclusion de cshtml avec l'action de génération none. Il suffit donc de sortir en renvoyant une valeur int non nulle.