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.
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. –
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
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