2011-03-09 8 views
1

J'ai une solution avec plusieurs projets C++. Pour certains projets, j'ai besoin d'une copie de fichier personnalisée, par ex. copier certains fichiers de configuration dans le répertoire de sortie ou copier les fichiers de sortie d'un projet dans un dossier spécifique après la génération.Comment Visual Studio 2010 héberge MSBuild pour les projets C++?

Dans certains cas, je ne veux pas ou ne peux pas ajouter ces fichiers directement aux projets via l'IDE de Visual Studio. J'ai créé des fichiers .targets simples que je peux réutiliser et ajouter aux projets qui nécessitent la copie du fichier.

Voici un exemple simple .targets fichier pour copier des fichiers de configuration:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<PropertyGroup> 
<BuildDependsOn> 
    $(BuildDependsOn); 
    CopyCustom 
</BuildDependsOn> 
</PropertyGroup> 
<ItemGroup> 
<CustomFiles Include="$(ProjectDir)Config\**\*.xml" /> 
</ItemGroup> 
<PropertyGroup> 
<DestCustFolder>$(OutDir)Config\</DestCustFolder> 
</PropertyGroup> 
<Target Name="CopyCustom" 
Inputs="@(CustomFiles)" 
Outputs="@(CustomFiles ->'$(DestCustFolder)%(RecursiveDir)%(FileName)%(Extension)')"> 
<Message Text="Copy custom files..." /> 
<Copy SourceFiles="@(CustomFiles)" DestinationFiles="@(CustomFiles->'$(DestCustFolder)%(RecursiveDir)%(FileName)%(Extension)')" SkipUnchangedFiles="true" /> 
</Target> 
</Project> 

Grâce à la « Build personnalisation » dialogue dans Visual Studio ajouter au projet de sorte qu'il sera inclus comme celui-ci à la fin du fichier de projet:

<ImportGroup Label="ExtensionTargets"> 
<Import Project="..\Targets\CopyCustom.targets" />/ 
</ImportGroup> 

Ceci devrait permettre la construction incrémentielle de ma cible personnalisée. Si je viens de modifier un de mes fichiers personnalisés (et aucun des fichiers C++) et construis forment la console avec

msbuild foo1.vcxproj 

il détecte en fait les changements et fait une accumulation supplémentaire pour ma cible personnalisée. Si aucune modification n'est effectuée, la cible est ignorée.

Si je ne construis cependant dans Visual Studio, il ne détecte pas les modifications apportées aux fichiers personnalisés et ne me donne le message que le projet est à des données:

========== Build: 0 succeeded, 0 failed, 5 up-to-date, 0 skipped ========== 

Je dois changer en plus un des fichiers C++ pour le faire vérifier à nouveau toutes les cibles et à la construction incrémentielle.

Je m'attendais à ce que Visual Studio exécute simplement MSBuild qui va ensuite effectuer la vérification à jour sur les projets, donc cela devrait être le même résultat que l'exécution de MSBuild à partir de la console. J'essayais d'obtenir plus d'informations en plaçant le niveau de verbosité au diagnostic mais je viens d'obtenir la même ligne. Il me semble que MSBuild n'est même pas exécuté pour le projet mais Visual Studio lui-même détermine que le projet est à jour.

Alors je me demandais comment Visual Studio détermine réellement quand il devrait exécuter MSBuild pour un projet.

J'ai demandé fondamentalement la même question avant sur le MSDN forum mais n'a pas pu obtenir une réponse claire.

+0

Il implémente toujours l'option/Gm, il utilise toujours le fichier .idb. Suffisamment de preuves que la vérification des dépendances n'a pas fondamentalement changé dans VS2010. –

+0

Nous avons désactivé l'option/Gm dans nos projets car elle est incompatible avec l'option/MP, donc aucun fichier .idb n'est créé. – Hoschie0815

+0

MSBuild 4.0 dispose également de la nouvelle fonctionnalité File Tracker pour les générations incrémentielles qui génère des fichiers .tlog et les fichiers .idb ne sont plus utilisés. Mais tout ceci ne devrait s'appliquer qu'à la construction incrémentale de la cible de compilation C++ dans MSBuild et non à la construction incrémentielle de la cible personnalisée. – Hoschie0815

Répondre

4

Voir this suggestion on Microsoft Connect.

Fondamentalement, vous devez définir la propriété DisableFastUpToDateCheck sur true pour désactiver la vérification de mise à jour rapide.

Il suffit d'ajouter à votre vcxproj ou vos cibles fichier:

<PropertyGroup> 
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck> 
</PropertyGroup> 
+0

Merci, je n'ai pas vérifié pendant un moment. En fait, j'étais celui qui écrit la suggestion sur Microsoft Connect :-) – Hoschie0815

1

J'ai trouvé une réponse en consultant le livre "Inside the Microsoft Build Engine, deuxième édition".

Note: J'ai également mis à jour le même dans ma question dans le MSDN forum mais je vais principalement reproduire le texte ici pour l'exhaustivité. Sur la page 280, ils disent en fait que l'EDI effectue une "vérification rapide et à jour" au niveau du projet. Il génère seulement une construction de projet et effectue une vérification plus fine sur les tâches individuelles si cette vérification au niveau du projet échoue. Lorsque vous exécutez MSBuild à partir de la ligne de commande, il y a toujours une vérification fine et à jour des différents outils. Par conséquent, l'IDE semble effectuer cette vérification rapide uniquement sur les fichiers qui sont directement ajoutés aux projets et définis comme l'un des types de fichiers d'entrée.

À mon avis, ce n'est pas un bon design. Je préférerais que l'EDI ne soit utilisé que pour éditer les fichiers de projet MSBuild, puis il appelle simplement MSBuild pour effectuer la vérification à jour. Cela le rendrait beaucoup plus clair.

Je peux comprendre que dans une solution avec beaucoup de projets, il peut rendre la vérification à jour beaucoup plus rapide, mais il devrait y avoir au moins une option pour désactiver la vérification rapide et à jour. Je vérifiais l'IDE s'il y avait un moyen de désactiver ce comportement mais je n'ai rien trouvé.

La solution proposée here fonctionne actuellement et je l'utilise pour le moment. Mais j'ai ajouté plusieurs cibles personnalisées pour différents types de fichiers personnalisés. Si j'ajoute un nouveau fichier personnalisé je ne devrais jamais oublier de le mettre à "Custom Build Tool" sinon la construction incrémentielle pour ce fichier ne fonctionnera pas.

Je suppose qu'une solution consisterait à effectuer une personnalisation complète de mes fichiers personnalisés et à utiliser des extensions de fichiers spécifiques afin que Visual Studio les détecte automatiquement lorsque je les ajoute au projet et définisse le bon type d'élément.

+0

Il existe une option pour désactiver la vérification rapide mise à jour. Voir ma réponse ci-dessous. –

Questions connexes