160 votes

Visual Studio : Comment "Copier dans le répertoire de sortie" sans copier la structure du dossier ?

J'ai quelques fichiers dll dans \lib du dossier de mon projet. Dans la page de propriétés de la dll, j'ai sélectionné "Build Action" comme "Content" et "Copy to Output Directory" comme "Copy always".

Après la construction, je reçois les dll copiées mais elles sont à l'intérieur. \bin\Release\lib et non dans \bin\Release.

Existe-t-il un moyen de copier des fichiers dll vers \bin\Release (et non pas à \bin\Release\lib ) sans écrire un script post-build ou avoir recours à nant etc ?

5voto

trojanfoe Points 61927

Pour ajouter mon chapeau dans l'anneau ici, si vous voulez inclure un répertoire entier de contenu et vous ne voulez pas suivre chaque fichier individuel dans Visual Studio, alors vous pouvez ajouter ceci dans votre fichier de projet (pour moi c'est un .vcxproj d'un projet UWP C++) :

<ItemGroup>
    <Content Include="Content\**">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
</ItemGroup>

Notez que le Content répertoire doit être dans le même répertoire que le fichier du projet afin de préserver la structure du répertoire.

3voto

DefenestrationDay Points 1110

Il semble que dans VisualStudio 2015, si les dll que vous "ajoutez avec un lien" sont dans un sous-dossier de ce même projet - ils seront automatiquement placés dans un dossier, et la sortie est également placée dans un dossier comme vous l'avez vu.

Si les dlls se trouvent dans un autre projet ou répertoire sur le disque pas dans un sous-dossier du projet vous pouvez "Ajouter avec un lien", et ils seront placés dans le répertoire racine sans problème.

3voto

AlainD Points 59

Les solutions ci-dessus n'ont pas fonctionné de manière fiable pour moi en Visual Studio 2019 Professional v16.8.2 . Parfois les fichiers se copient, parfois non. Après de nombreuses tentatives, il semble que quelque chose ait été cassé dans les dernières mises à jour de VS.

Cette réponse montre comment utiliser un script post-build... ce que demande le PO. no à faire ! Cette réponse s'adresse donc uniquement à ceux qui, comme moi, n'ont pas réussi à faire fonctionner les méthodes plus traditionnelles.

  • Cliquez avec le bouton droit de la souris sur le projet et sélectionnez Ajouter > Élément existant...
  • Naviguez jusqu'au lib et sélectionnez le ou les éléments à ajouter.
  • A droite de Add cliquez sur la flèche vers le bas et choisissez Add As Link
  • Cliquez avec le bouton droit de la souris sur chaque fichier du nouveau dossier "lib" de votre projet, et réglez "Copier dans le répertoire de sortie" sur "Ne pas copier".
  • Ouvrir les propriétés du projet Build Events et ajoutez l'événement Post-build suivant

,

rem Copy 3rd party DLL(s) to the output directory on successful build
COPY $(ProjectDir)lib\Something.dll $(TargetDir)
COPY $(ProjectDir)lib\SomethingElse.dll $(TargetDir)

Notez que vous pouvez utiliser des caractères génériques dans l'événement post-construction pour copier plusieurs fichiers.

1voto

Kyle Points 13

En ce qui concerne votre question, les étapes suivantes ont fonctionné pour moi en Visual Studio 2019 :

Dans l'éditeur Visual Studio, pour votre dll, définissez le paramètre "Build Action" comme étant "Content" (Cela peut être facultatif) et "Copier dans le répertoire de sortie" comme "Ne pas copier" .

Les éléments suivants seront alors générés dans le projet csproj fichier :

<ItemGroup>
  <Content Include="lib\IncludedDLL.dll" />
</ItemGroup>

Modifiez l'entrée en la remplaçant par la suivante :

<ItemGroup>
  <Content Include="lib\IncludedDLL.dll" />
  <Content Include="lib\IncludedDLL.dll">
    <Link>IncludedDLL.dll</Link>
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </Content>
</ItemGroup>

Vous pouvez définir "CopyToOutputDirectory" (copie du répertoire de sortie) option dans le projet csproj fichier manuellement soit "Toujours" o "Préserver l'avenir" .

Dans l'éditeur Visual Studio, le paramètre "Copier dans le répertoire de sortie" sera toujours affiché comme "Ne pas copier". mais le fichier sera copié dans le répertoire de sortie Root lors de la reconstruction .

La modification ci-dessus n'est pas nécessaire si vous ne voulez pas copier le fichier dans le répertoire de sortie Root, donc si c'est le cas, vous pouvez simplement supprimer manuellement la modification ci-dessus dans le fichier csproj du projet pour revenir au comportement sans copie.

0voto

ChuckEng Points 11

Une autre méthode consiste à laisser les éléments tels quels. None . Dans l'explorateur de solutions, cliquez sur celles que vous souhaitez déployer et définissez les paramètres suivants Content à la propriété True .

Note : J'ai fait ceci dans VS2019, et les choses peuvent changer de version en version.

Pour que cela fonctionne, cliquez avec le bouton droit de la souris sur votre projet, et sélectionnez "Décharger le projet". Ensuite, faites un clic droit sur le projet déchargé et sélectionnez "Edit project_name.vcxproj".

Dans l'éditeur, allez jusqu'au bas du fichier et insérez cette cible juste avant la fin de l'élément suivant </Project> étiquette :

  <Target Name="CopyContent" AfterTargets="Build">
    <Copy SourceFiles="@(None)" Condition="'%(None.DeploymentContent)' == 'true'" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
  </Target>

Maintenant, faites un clic droit sur le projet déchargé et sélectionnez "Reload Project". Sélectionnez pour enregistrer et fermer si vous y êtes invité.

J'ai également réglé le OutputDirectory à :

$(SolutionDir)bin\$(Configuration)\$(Platform)\

et le IntermediateDirectory à :

$(SolutionDir)obj\$(Configuration)\$(ProjectName)\$(Platform)\

dans la page générale des propriétés du projet. Cela place la sortie dans un dossier "bin", et les intermédiaires dans un dossier "obj" dans la racine de votre solution.

Note : Le $(SolutionDir) n'est pas défini lorsque vous exécutez MSBuild à partir de la ligne de commande. Il y a une astuce que vous pouvez utiliser pour définir le dossier où se trouve le fichier .sln en utilisant GetDirectoryNameOfFileAbove. (laissé comme un exercice pour le lecteur). De plus, il semble qu'en 2019, ils gèrent cela correctement sur la ligne de commande de toute façon. Ouais :) Le site $(SolutionDir) contient une barre oblique inversée à la fin, donc aucune après elle. Les résultats de chacun d'eux doivent avoir une barre oblique inversée de fin.

Maintenant, si vous possédez Pro ou plus, s'il vous plaît ne faites pas cela chaque fois que vous devez créer un projet. Ce serait nul. Au lieu de cela, une fois que vous avez configuré votre projet comme vous le souhaitez, sélectionnez Project -> Export Template . Vous lui donnez un nom, et la prochaine fois que vous voulez créer un projet similaire, il suffit de choisir ce nom dans la boîte de dialogue Nouveau projet. (Dans les anciennes versions, je pense que c'était Files -> Export Teamplate... .)

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