web-dev-qa-db-fra.com

Visual Studio ajoute un événement de pré-génération qui s'exécute toujours (projet C #)

Dans mon projet, j'utilise un outil externe pour mettre à jour certains fichiers binaires. Ces fichiers sont inclus dans le projet en tant que "contenu".

Pour le moment, l'outil est configuré pour s'exécuter lors de "l'événement de pré-génération" dans les propriétés du projet C #. Malheureusement, cet événement n'est exécuté que si le projet est obsolète, ce qui n'est pas ce dont j'ai besoin.

Je travaille autour de cela en utilisant toujours "reconstruire" au lieu de "construire" sur mon projet, mais c'est fastidieux et lent.

Je dois toujours exécuter cet outil, que le projet soit ou non à jour. En réalité, avant même que MSBuild détermine si le projet est à jour, l'outil modifie certains des fichiers inclus dans le projet, ce qui affecte le résultat de la vérification à jour.

Y a-t-il une bonne façon de le faire?

21
kaalus

Voici la solution. Définissez cette propriété dans votre fichier de projet:

<PropertyGroup>
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup> 

PreBuildStep sera ensuite exécuté à chaque fois, que le projet soit ou non à jour.

Il semble que Visual Studio ignore les contrôles normaux à jour de MSBuild et utilise une sorte de contrôle personnalisé plus rapide, mais qui a pour effet secondaire de casser les cibles de construction personnalisées.

34
kaalus

Au niveau du projet, vous avez trois options:

1) Action de pré-construction

<PropertyGroup>
  <PreBuildEvent>notepad.exe Foo.txt</PreBuildEvent>
</PropertyGroup>

2) cible normale BeforeBuild 

<Target Name="BeforeBuild">
  <Exec Command="notepad.exe Foo.txt" />
</Target>

3) "attaché" à "construire" cible (comme stijn suggéré)

<Target Name="BeforeBuild2" BeforeTargets="Build">
  <Exec Command="notepad.exe Foo.txt" />
</Target>

En réalité, cette solution (dans le cas de la compilation) ne fonctionnera pas, car DependsOnTargets est exécuté AVANT BeforeTargets . Et exactement dans DependsOnTargets, le réel (CoreBuild) est assis:) C'est pourquoi ils ont inventé la cible 'BeforeBuild';)


Dans les deux cas, VS vérifie si quelque chose est en train de changer (les fichiers sont à jour). Pourquoi voulez-vous même exécuter un programme externe si rien n'a été changé? Si ce programme fonctionne sur un fichier (par exemple, "contenu"), msbuild et VS doivent détecter les fichiers obsolètes et les processus en cours.


Malheureusement, IDE (Visual Studio) a sa propre méthode pour traiter les projets msbuild. Le mécanisme principal est le même, mais quand vient le temps de déterminer quel projet est construit ou non, ou dans quel ordre ... VS agit totalement différent.

Vous pouvez utiliser un outil externe et exécuter "msbuild" sur votre solution ou votre projet. Cela compilera également "la bonne manière" et les fichiers binaires ne seront pas différents, mais vous aurez toutes les capacités et le potentiel de MsBuild

7
Carnifex

Aucune de ces solutions ne fonctionnait pour moi avec Visual Studio pour Mac. Je veux exécuter un script bash avant de construire le projet mais depuis que j'utilise Xamarin, certaines choses sont en train de se gâter. J'ai essayé tous les différents types de cibles et même les commandes de commande personnalisées dans les options de projet, mais j'avais quand même des problèmes avec MSbuild qui s'exécutait automatiquement ou qui ne fonctionnaient pas vraiment avant la construction. 

Vous pouvez exécuter les événements PreBuild dans un projet distinct compilé avant votre projet principal. 

  1. Créez un nouveau projet et nommez-le comme "PreBuildEvent"
  2. Ajoutez vos cibles/commandes MSbuild comme indiqué ci-dessus à ce nouveau fichier PreBuildEvent.csproj pour chaque configuration de groupe de propriétés/construction
  3. Dans le projet où vous originellement pour effectuer le travail de PreBuild, ajoutez une référence à ce nouveau projet.
  4. Ce nouveau projet générera d’abord, en exécutant tous les événements de PreBuild, et une fois ce projet construit, il démarrera la construction de votre projet original. En effet, lorsque vous ajoutez une référence à un projet, Visual Studio veille à les construire dans le bon ordre.
0
stepheaw

Il existe également un événement de pré-construction supplémentaire qui n'a pas été abordé ici. Habituellement, les analyseurs de code l'utilisent pour vérifier si l'analyseur de code a été téléchargé par NuGet. 

Donc, si vous voulez exécuter quelque chose avant les analyseurs de code, vous devez utiliser cette cible.

Il vous suffit d'ajouter le noeud <Target/> sous le noeud <Project/> dans votre fichier .csproj:

<Target Name="DownloadNugetPackages" BeforeTargets="PrepareForBuild">
    <Exec Command="notepad.exe Foo.txt"/>
</Target>

L'événement PrepareForBuild sera exécuté avant les événements pré-build.

0
Shoter