webentwicklung-frage-antwort-db.com.de

In Ausgabeverzeichnis kopieren kopiert die Ordnerstruktur, möchte jedoch nur Dateien kopieren

Ich habe einen VS2008. Ich möchte bestimmte Dateien aus einem Verzeichnis in meinen Ordner /bin/ Kopieren. Ich habe die Dateien (in /common/browserhawk/) Auf "In Ausgabeverzeichnis kopieren" gesetzt. Es kopiert jedoch auch die Ordnerstruktur: Die Dateien werden nach /bin/common/browserhawk/ Kopiert.

Wie kann ich diese Dateien auf nur /bin/ Kopieren? Ich möchte diese nicht im Stammverzeichnis der Website speichern, damit sie korrekt kopiert werden.

Verwandte Frage: Visual Studio fügt dem Projekt nach dem Kompilieren DLL- und PDB-Dateien hinz

87
Steve Wright

Sie können ein Post-Build-Ereignis hinzufügen, um die Dateien zu kopieren.
Wechseln Sie zu den Projekteigenschaften auf der Registerkarte Ereignisse erstellen, und fügen Sie der Befehlszeile für Ereignisse nach dem Erstellen Folgendes hinzu:

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

Stellen Sie sicher, dass Sie die Anführungszeichen einfügen, wenn Ihr Projektpfad Leerzeichen enthält.

59
Bill A.

Da ich bisherige Antworten nicht kommentieren kann, werde ich die Lösung hier stellen:

Fügen Sie Ihrer .csproj/.vbproj-Datei das Folgende hinzu, was @PaulAlexander bereitgestellt hat:

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

Auf diese Weise können Sie "RootContent" als Build-Aktion im Eigenschaftenfenster auswählen und über die GUI auf alle zugreifen. Eine vollständigere Erklärung: Die Option "AvailableItemName" erstellt im Grunde genommen eine neue Named-List, der Sie Elemente im Projekt unter der Eigenschaft "Build Action" im Eigenschaftenfenster zuweisen können. Sie können diese neu erstellte Liste dann in einem beliebigen Ziel verwenden (z. B. über "@ (RootContent)").

44
shockwave

Wenn Sie die Datei .csproj/.vbproj in einem Texteditor bearbeiten, können Sie steuern, wo sich die Datei im Ausgabeverzeichnis befindet und welchen Namen die Datei im Ausgabeverzeichnis hat. Beispielsweise:

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

Dadurch wird die Datei content\someContent.txt into bin\someContentInOutputDirectory.txt. Sie können auch ein Unterverzeichnis in bin auswählen, wenn Sie möchten. Fügen Sie es einfach zum Link-Element hinzu.

43

Ich glaube, dass der Befehl XCOPY Verzeichnisse und Dateien besser handhabt. Deshalb,

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

Damit können Ordner außerhalb des Zielverzeichnisses erstellt werden.

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

Die Projektordner-/Dateistruktur von:

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

Wird:

    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

Fügen Sie Ihrer .csproj/.vbproj-Datei Folgendes hinzu

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

Ändern Sie dann die Build-Aktion aller Dateien, die Sie im Stammordner haben möchten, in RootContent.

10
Paul Alexander

Ich habe dies in VS2010 und VS2015 verwendet. Ich bevorzuge diese Lösung, weil:

  1. Das XML kann in jedem Projekt wiederverwendet werden
  2. Der "RootContent" wird in der Visual Studio-Benutzeroberfläche wie jeder andere "Content" als Build-Aktion ausgewählt.
  3. Das "CopyToOutputDirectory" wird genau wie erwartet eingehalten
  4. Der RootContent wird zur Projektausgabe hinzugefügt: wird über Projektreferenzen übertragen, befolgt "Clean" usw.
  5. Der RootContent kann mit einem Platzhalter angegeben werden, wobei die rekursive Ordnerstruktur erhalten bleibt:
    <RootContent Include="common\browserhawk\**">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </RootContent>
    

Zum Anfang der Projektdatei:

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

Aus dieser Antwort entlehnt

Nach dem Microsoft .targets-Import:

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

Aus dieser Antwort entlehnt

5
MattGerg

Am Ende habe ich der nant-Build-Datei einen Schritt hinzugefügt, den ich nach erfolgreicher Fertigstellung kopieren wollte

<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

Sie können eine Batchdatei erstellen, um die Dateien zu kopieren und als Postbuild-Ereignis auszuführen.

1
jvanderh