web-dev-qa-db-fra.com

Copier dans le répertoire de sortie copie la structure du dossier mais souhaite uniquement copier les fichiers

J'ai un VS2008, je veux copier certains fichiers d'un répertoire dans mon /bin/ dossier. J'ai défini les fichiers (situés dans /common/browserhawk/) dans "Copier vers le répertoire de sortie". Cependant, il copie également la structure des dossiers: les fichiers sont copiés dans /bin/common/browserhawk/

Comment puis-je obtenir ces fichiers à copier juste /bin/? Je ne veux pas les stocker à la racine du site Web pour les faire copier correctement.

Question connexe: Visual Studio ajoute .dll et .pdb au projet après la compilation

87
Steve Wright

Vous pouvez ajouter un événement post-génération pour copier les fichiers.
Accédez aux propriétés du projet, onglet Créer des événements et ajoutez ce qui suit à la ligne de commande de l'événement post-génération:

copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"

Assurez-vous d'inclure les guillemets si le chemin de votre projet contient des espaces.

59
Bill A.

Comme je ne peux pas commenter les réponses précédentes, je vais mettre la solution ici:

En ajoutant à ce que @PaulAlexander a fourni, ajoutez ce qui suit à votre fichier .csproj/.vbproj:

<ItemGroup>
    <AvailableItemName Include="RootContent">
      <Visible>false</Visible>
    </AvailableItemName>  
</ItemGroup>
<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>

Cela vous permet de sélectionner "RootContent" comme action de génération dans la fenêtre Propriétés, et tout est accessible via l'interface graphique. Une explication plus complète: l'option "AvailableItemName" crée essentiellement une nouvelle liste nommée à laquelle vous pouvez affecter des éléments dans le projet sous la propriété "Build Action" dans la fenêtre Propriétés. Vous pouvez ensuite utiliser cette liste nouvellement créée dans n'importe quelle cible de votre choix (par exemple via "@ (RootContent)").

44
shockwave

Si vous modifiez le fichier .csproj/.vbproj dans un éditeur de texte, vous pouvez contrôler où le fichier est placé dans le répertoire de sortie et également quel nom le fichier aura dans le répertoire de sortie. Par exemple:

<None Include="content\someContent.txt">
  <Link>someContentInOutputDirectory.txt</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

Cela mettra le fichier content\someContent.txt en bin\someContentInOutputDirectory.txt. Vous pouvez également choisir un sous-répertoire dans bin si vous le souhaitez; ajoutez-le simplement à l'élément Link.

43
Daniel Yankowsky

Je pense que la commande XCOPY gère mieux les répertoires et les fichiers. Par conséquent,

    XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y

Ce qui permet de créer des dossiers à partir du répertoire cible.

    XCOPY "$(ProjectDir)Templates" "$(TargetDir)" /E /I /F /Y

La structure du dossier/fichier du projet de:

    A:\TEMP\CONSOLEAPPLICATION3\TEMPLATES
    ├───NewFolder1
    ├───NewFolder2
    │       TextFile1.txt
    │       TextFile2.txt
    └───NewFolder3
            TextFile1.txt
            TextFile2.txt
            TextFile3.txt

Devient:

    A:\TEMP\CONSOLEAPPLICATION3\BIN\DEBUG
    │   ConsoleApplication3.exe
    │   ConsoleApplication3.pdb
    │   ConsoleApplication3.vshost.exe
    │   ConsoleApplication3.vshost.exe.manifest
    ├───NewFolder1
    ├───NewFolder2
    │       TextFile1.txt
    │       TextFile2.txt
    │
    └───NewFolder3
            TextFile1.txt
            TextFile2.txt
            TextFile3.txt
15
AMissico

Ajoutez ce qui suit à votre fichier .csproj/.vbproj

<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>

Modifiez ensuite l'action de génération de tous les fichiers que vous souhaitez dans le dossier racine en RootContent.

10
Paul Alexander

Je l'ai utilisé dans VS2010 et VS2015. Je préfère cette solution car:

  1. Le XML est réutilisable dans n'importe quel projet
  2. Le "RootContent" est choisi comme une action de construction dans l'interface utilisateur de Visual Studio, comme tout autre "contenu"
  3. Le "CopyToOutputDirectory" est respecté, comme vous vous en doutez
  4. Le RootContent est ajouté à la sortie du projet: se fait à travers Project-References, obéit à "Clean", etc.
  5. Le RootContent peut être spécifié avec un caractère générique, en préservant la structure de dossier récursive:
    <RootContent Include="common\browserhawk\**">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </RootContent>
    

Vers le début du fichier de projet:

  <ItemGroup>
    <AvailableItemName Include="RootContent">
      <!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
      <Visible>False</Visible>
    </AvailableItemName>
  </ItemGroup>

emprunté à cette réponse

Après l'importation Microsoft .targets:

  <PropertyGroup>
    <AssignTargetPathsDependsOn>
      $(AssignTargetPathsDependsOn);
      IncludeRootContentAsContent;
    </AssignTargetPathsDependsOn>
  </PropertyGroup>
  <Target Name="IncludeRootContentAsContent">
    <CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
      <Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
    </CreateItem>
  </Target>

emprunté à cette réponse

5
MattGerg

J'ai fini par ajouter une étape au fichier de construction nant à copier après une compliation réussie

<target name="action.copy.browserhawk.config" depends="compile.source">
    <copy todir="${App.Web.dir}/bin/" includeemptydirs="false">
        <fileset basedir="${browserhawk.config.dir}">
            <include name="bhawk_bb.dat" />
            <include name="bhawk_sp.dat" />
            <include name="browserhawk.properties" />
            <include name="maindefs.bdd" />
            <include name="maindefs.bdf" />
            <include name="BH_PRO.lic" />
        </fileset>
    </copy>
    <echo message="COPY BROWSERHAWK CONFIG: SUCCESS   ${datetime::now()}" />
</target>
2
Steve Wright

Vous pouvez créer un fichier de commandes pour copier les fichiers et l'exécuter en tant qu'événement post-génération.

1
jvanderh