Kopieren von Dateien in den Anwendungsordner zur Kompilierungszeit

93

Wenn ich einige Dateien habe, die ich .\bin\debug\beim Kompilieren aus meinem Projekt in den Ordner kopieren möchte , muss ich sie anscheinend im Stammverzeichnis des Projekts ablegen. Wenn Sie sie in einen Unterordner legen, werden sie in .\bin\debug\derselben Struktur, in der sie gespeichert sind, in den Ordner kopiert .

Gibt es eine Möglichkeit, dies zu vermeiden?

Um ganz klar zu sein: Wenn ich ein MyFirstConfigFile.txtund MySecondConfigFile.txtin einem ConfigFilesOrdner habe und deren Kopie auf Ausgabe als Kopie ... eingestellt habe , werden sie im .\bin\debug\ConfigFiles\Ordner angezeigt. Ich möchte, dass sie im .\bin\debug\Ordner angezeigt werden.

Andrew Ducker
quelle

Antworten:

90

Sie können dies mit einem Post-Build-Ereignis tun. Setzen Sie die Dateien beim Kompilieren auf keine Aktion und kopieren Sie sie dann im Makro in das gewünschte Verzeichnis.

Hier ist ein Post-Build-Makro, das meiner Meinung nach funktioniert, indem alle Dateien in einem Verzeichnis namens Configuration in den Root-Build-Ordner kopiert werden:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)
JoshBerke
quelle
1
Sollte es für das Ziel nicht $ (ProjectDir) \% (OutDir) sein?
Ed Greaves
11
Das korrekte und getestete (Vs2010) Makro lautet: copy "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot
Sie können auch einfach eine relative Datei für die Ausgabe erstellen: Kopieren Sie "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen
3
Ich denke, dass die Verwendung von Anführungszeichen notwendig ist:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
Tedebus
1
In MSVS2017 (15.4) sollte es nur sein $(OutDir)(dh ohne $(ProjectDir)), wie es scheint ... sonst erhalten Sie doppelte
Pfadfehler
51

Sie können so eine MSBuild-Aufgabe auf Ihrem csproj verwenden.

Bearbeiten Sie Ihre csproj-Datei

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>
Jhonny D. Cano -Leftware-
quelle
Dies ist die beste Lösung, da Sie Platzhalter zum Kopieren vieler Dateien verwenden können und diese nicht im Projekt enthalten sein müssen.
Chris Bordeman vor
37

Sie können die Dateien oder Links auch in das Stammverzeichnis des Lösungs-Explorers einfügen und dann die Dateieigenschaften festlegen:

Build action = Content

und

Copy to Output Directory = Copy if newer (beispielsweise)

Ziehen Sie für einen Link die Datei aus dem Windows-Explorer in den Lösungs-Explorer, indem Sie die Umschalt- und Steuertaste gedrückt halten.

Geben Sie hier die Bildbeschreibung ein

Georg
quelle
3
Dadurch bleibt der ursprüngliche relative Pfad erhalten, der für die OP
jlee
Wenn Sie die Datei in den obersten Knoten Ihres Projekts einfügen, wird sie direkt in den Ausgabeordner $ (OutputPath) kopiert.
Georg
3

Kopieren von Unterordner zu Unterordner

 if not exist "$(ProjectDir)$(OutDir)subfolder" mkdir "$(ProjectDir)$(OutDir)subfolder"

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"
Ehsäɳ Khʌɳ
quelle
7
Willkommen bei StackOverflow und vielen Dank für Ihren Beitrag. Sie haben eine wirklich alte Frage beantwortet, die bereits eine Reihe von hoch bewerteten Antworten enthält. Wenn Sie der Meinung sind, dass Ihre Antwort zusätzlich zu den vorhandenen Antworten positiv ist, sollten Sie eine kleine Erklärung hinzufügen, warum Ihre Antwort das Problem löst und warum sie besser / anders als die anderen ist.
Matthijs Wessels
3

Persönlich bevorzuge ich diesen Weg.

Ändern Sie das, .csprojum hinzuzufügen

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>
Jérôme MEVEL
quelle
1
Meiner Meinung nach viel besser als ein Event nach dem Bau. Danke dir!
Khlr
Ist dies nicht gleichbedeutend damit, dass Sie mit der rechten Maustaste auf das Projekt klicken und im Projektmappen-Explorer "Hinzufügen | Vorhandenes Element" auswählen und dann die Dateieigenschaft "In Ausgabeverzeichnis kopieren" auf "Wenn neuer kopieren" setzen. Das XML muss nicht direkt geändert werden.
Antony Booth
@AntonyBooth Nach einer Weile werden Sie feststellen, dass es immer einfacher ist, die Vorgänge zu verstehen und den Code direkt zu ändern, als zu lernen, wie Sie dasselbe mit Ihrer IDE tun. Heute verwenden Sie Visual Studio, morgen möglicherweise JetBrains Rider und übermorgen VS Code. Am Ende beherrschen Sie immer besser eine Sprache als eine IDE. PS: Ich weiß nicht, ob das, was Sie beschreiben, dasselbe ist, da ich nur weiß, wie man es in XML macht, viel besser so.
Jérôme MEVEL vor
1

Sie möchten ein Post-Build-Ereignis für Ihr Projekt verwenden. Dort können Sie die Ausgabe angeben und es gibt Makrowerte für häufig verwendete Dinge wie Projektpfad, Elementname usw.

Mark Sherretta
quelle
0

Sie können das PostBuild-Ereignis des Projekts verwenden. Nach Abschluss des Builds können Sie eine DOS-Batchdatei ausführen und die gewünschten Dateien in den gewünschten Ordner kopieren.

Kirtan
quelle
0

Ich fand diese Frage auf der Suche nach "Dateien beim Kompilieren in den Anwendungsordner kopieren". OP scheint dies bereits sortiert zu haben, aber wenn Sie dies nicht tun:

Klicken Sie in Visual Studio mit der rechten Maustaste auf die Datei, wählen Sie Eigenschaften aus und ändern Sie die Option "In Ausgabe kopieren" in "Immer". Siehe http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx

Oberst Panik
quelle
5
OP bittet um Kopieren, um das Verzeichnis zu kompilieren, ohne die relative Verzeichnisstruktur des kopierten Dateispeicherortes
beizubehalten