web-dev-qa-db-fra.com

Copie automatique des fichiers à générer lors de la création de l'application

Il y a Copier dans le répertoire de sortie propriété pour les fichiers dans les projets C #. Mais dans les projets VC++, il est absent. Je sais que je peux utiliser Construire des événements dans VC++ et y écrire quelque chose comme

xcopy /y /d %(FullPath) $(OutDir)

Existe-t-il un moyen d'éviter l'utilisation de CMD (et d'autres méthodes de script)? Est-ce que msbuild peut faire quelque chose pour aider dans ce cas?

50
Loom

Cela dépend de la version de Visual Studio que vous utilisez. Le format du fichier de projet VC++ dans Visual Studio 2008 n’est pas MSBuild et l’utilisation de xcopy dans PostBuildStep est donc un bon choix.

Le projet VC++ dans Visual Studio 2010 a le format MSBuild. Ainsi, il existe une fonctionnalité de la tâche MSBuild Copy.

Ci-dessous un exemple:

<Copy
    SourceFiles="%(FullPath)"
    DestinationFolder="$(OutDir)"
/>

Si le répertoire de destination n'existe pas, il est créé automatiquement

Une référence de tâche de copie MSDN est ici

11
Anton K

MSBuild peut-il faire quelque chose pour aider dans ce cas?

En utilisant MSVC 2012, cela a fonctionné pour moi:

Supposons que vous ayez un fichier "Data/ThisIsData.txt" dans votre projet c ++.

Décharger le projet (clic droit -> Décharger le projet).
Modifier le projet XML (clic droit -> Modifier .vcxproj)
Vous voyez maintenant le fichier MSBuild du projet au format XML dans votre éditeur.

Trouvez "ThisIsData.txt". Cela devrait ressembler à quelque chose comme:

<ItemGroup>
<None Include="Data\ThisIsData.txt" />
...
</ItemGroup>

Ajoutez maintenant un autre groupe d’articles comme celui-ci:

<ItemGroup>
<Content Include="Data\ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...
</ItemGroup>

Rechargez le projet et construisez.
Votre fichier "ThisIsData.txt" doit être copié dans $ (OutDir)\Data\ThisIsData.txt.

Pourquoi dupliquer ItemGroup?

Eh bien, si vous changez simplement l'inclusion Aucune en une inclusion de contenu, le IDE ne semble plus l'apprécier et ne l'affichera plus. Donc, pour conserver une option d'édition rapide pour mes fichiers de données, j'ai décidé de conserver les entrées dupliquées.

87
jochen

Dans VS 2015, il est possible de donner aux projets C la fonctionnalité en C # . (Idée tirée de la réponse de jochen.) Au lieu d'ajouter un autre groupe d'éléments, modifiez le groupe d'éléments ajouté en ajoutant un élément CopyTo. I.E, en utilisant son exemple, améliore simplement l'entrée d'origine pour:

<ItemGroup>
  <None Include="Data\ThisIsData.txt" />
    <DeploymentContent>true</DeploymentContent>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
...
</ItemGroup>

Aucun autre ItemGroup requis. En ajoutant l'élément CopyTo, vous ajoutez une propriété "Included In Project".

 VS 2015 C Property with Included In Project added

17
Henri Socha

Après la réponse de henri-socha à propos de VS2015 (et probablement de VS2013 et VS2012, ou de tout ce qui utilise des projets de style MSBuild), le type d'élément ItemGroup est important.

Plus précisément, les éléments <Text> ne semblent pas être copiés, contrairement aux éléments <Content>.

Ainsi, pour un répertoire de projet Data contenant un fichier texte ThisIsData.txt, cela créera un sous-répertoire Data sous le répertoire $(OutDir) et copiera le fichier ThisIsData.txt à partir du projeter dedans si c'est plus récent:

<ItemGroup>
  <Content Include="Data\ThisIsData.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

Ce n'est pas le cas, bien que ce soit ce que Visual Studio IDE insérera si vous ajoutez le fichier texte à votre projet et définissez la propriété Content sur True.

<ItemGroup>
  <Text Include="Data\ThisIsData.txt">
    <DeploymentContent>true</DeploymentContent>
  </Text>
</ItemGroup>

En d'autres termes, vous devez ajouter le fichier via IDE pour lui faire comprendre que le fichier est inclus dans le projet (ce qui ajoute la balise <Text>, ItemGroup), puis ouvrez le projet dans un éditeur de texte et ajoutez la balise <Content>. ItemGroup pour le faire faire ce que vous voulez.

Je ne suis pas sûr de ce que fait réellement la balise <DeploymentContent>. C'est peut-être un vestige puisque la seule référence MSDN que j'ai pu trouver considère qu'il est archivé: https://msdn.Microsoft.com/en-us/library/aa712517.aspx

5
WaffleSouffle

Vous pouvez spécifier la copie dans le fichier de projet comme a répondu Jeff G dans une autre question:

Dans le fichier *.vcxproj, changez:

<Text Include="Filename.txt" />

à:

<Content Include="Filename.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

Puis dans le fichier *.vcxproj.filters, changez:

<Text Include="Filename.txt">
    <Filter>Resource Files</Filter>
</Text>

à:

<Content Include="Filename.txt">
    <Filter>Resource Files</Filter>
</Content>

où la balise <Text ...> est pour les fichiers texte spécifiés (ce sera <Image ...> pour les fichiers image, etc.)

0
kjhf