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
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.
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)").
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.
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
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.
Ich habe dies in VS2010 und VS2015 verwendet. Ich bevorzuge diese Lösung, weil:
<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>
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>
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>
Sie können eine Batchdatei erstellen, um die Dateien zu kopieren und als Postbuild-Ereignis auszuführen.