web-dev-qa-db-fra.com

Assurez-vous que tous les fichiers * .cshtml sont définis comme "Contenu" pour l'action de construction

Parfois, lorsque je copie-colle des fichiers *.cshtml, Visual Studio définit, pour une raison quelconque, Build Action sur ces fichiers comme "Aucun": Comments.cshtml is set to be "None" on Build Action

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?

33
trailmax

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="&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>

Au lieu de <Warning ...>, vous pouvez également utiliser <Error ...>

Vous devez insérer manuellement l'un de ces extraits dans votre fichier de projet:

enter image description here

30
jessehouwing

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.

4
Jacob Brewer

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 )

NPM alternative

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:

Exemple simple

  1. Installer le module de nœud

    npm i check-vs-includes

  2. Ajouter une tâche à votre gulpfile.js:

 var checkVSIncludes = require ('check-vs-includes'); 
 
 ... 
 
 gulp.task ('checkVSIncludes', function () {
 checkVSIncludes (['/ Views/**/*. cshtml', '/app/**/*.js']);
})) 
  1. Exécutez la vérification dans le dossier de votre projet (où se trouve votre fichier .csproj)

    gulp checkVSIncludes

3
Bart

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.

0
Miloš Cigoj