109 votes

Inclure des fichiers de contenu dans .csproj qui sont en dehors du cône du projet

J'ai un projet C# appelé MyProject.csproj situé dans "C:\Projects\MyProject\". J'ai aussi des fichiers que je veux copier dans le répertoire de sortie de ce projet. Cependant, les fichiers sont situés dans le dossier "C:\MyContentFiles\", c'est-à-dire qu'ils ne se trouvent pas dans le cône du projet. Ce répertoire comporte également des sous-répertoires. Le contenu du répertoire n'est pas géré. Par conséquent, je dois inclure tout ce qui s'y trouve.

Lorsque je les inclus en tant que 'Contenu' dans le projet, ils sont bien copiés, mais la structure du répertoire est perdue. J'ai fait quelque chose comme ceci :

  PreserveNewest

Comment puis-je copier ces fichiers/dossiers de manière récursive dans le répertoire de sortie du projet en préservant la structure du répertoire ?

203voto

Mandark Points 448

Je crois que @Dmytrii a raison d'une part - vous voulez utiliser la fonction "link".

Cependant, il a seulement partiellement raison en disant que vous ne pouvez pas lier à une arborescence de répertoires. Alors que c'est en effet vrai en essayant d'ajouter les liens en utilisant l'interface graphique de Visual Studio, MSBuild le prend en charge.

Si vous voulez préserver la structure de répertoires, ajoutez simplement la balise %(RecursiveDir) à votre nœud :

  %(RecursiveDir)%(Filename)%(Extension)
  PreserveNewest

La page MSBuild Well-known Item Metadata explique plus en détail les métadonnées auxquelles vous pouvez accéder.

66voto

Dmytrii Nagirniak Points 10979

Vous devez ajouter le fichier sous forme de lien :

  1. Cliquez avec le bouton droit sur le projet dans VS.
  2. Ajouter -> Élément existant...
  3. Trouvez le fichier.
  4. Sélectionnez-le et.
  5. Ajoutez sous forme de lien (menu déroulant dans le bouton Ajouter de la boîte de dialogue).
  6. Ouvrez les propriétés du fichier et définissez "Copier dans le répertoire de sortie" sur "Copier toujours".

MAIS Vous ne pouvez pas le faire pour l'arborescence des répertoires.
Au lieu de cela, vous devez écrire une tâche post-génération pour cela. Ceci est un exemple qui vous aidera à démarrer.

36voto

La réponse de Mandark ajoute les fichiers de contenu directement à la solution, et ils apparaîtront dans l'explorateur de solutions. Chaque fois qu'un fichier est ajouté ou supprimé dans le répertoire d'origine, cela n'est pas automatiquement pris en compte par Visual Studio. De plus, chaque fois qu'un fichier est supprimé ou ajouté dans l'explorateur de solutions, le fichier de projet est modifié et tous les fichiers sont inclus séparément, au lieu d'inclure simplement le dossier.

Pour éviter cela, vous pouvez utiliser le même stratagème, mais le mettre dans un fichier de projet séparé et l'importer ensuite.

Le fichier de projet (par exemple include.proj) ressemble à ceci :

  %(RecursiveDir)%(Filename)%(Extension)
  PreserveNewest

Dans votre propre fichier de projet, ajoutez la ligne suivante

Visual Studio ne touchera pas à ce fichier, et ajoutera simplement les fichiers en tant que contenu lors d'une construction. Les modifications dans le répertoire d'origine sont toujours incluses. Les fichiers n'apparaîtront pas dans votre explorateur de solutions, mais seront inclus dans le répertoire de sortie.

J'ai découvert ce truc ici : http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx

15voto

Todd Points 3037

La suite, que vous ajouteriez en bas de votre fichier de projet, copiera vos fichiers de contenu en conservant la structure des répertoires dans un événement de build vers le répertoire cible $(TargetDirectory) de votre build (généralement $(MSBuildProjectDirectory)\bin\Debug).

Si ces fichiers doivent être placés dans un répertoire nommé MesFichiersDeContenu, vous pourriez ajouter ceci avant la copie :

et changer

à

10voto

zwcloud Points 2251

Pour inclure des fichiers dans un dossier pour un projet .NET Core,

    PreserveNewest

    PreserveNewest

Et la propriété "Copier dans le répertoire de sortie" des éléments sera "Copier si plus récent" :
Copier si plus récent

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X