webentwicklung-frage-antwort-db.com.de

Automatisches Kopieren von Dateien zur Ausgabe während der Anwendungserstellung

Es gibt Copy to Output Directory property für Dateien in C # -Projekten. In VC++ - Projekten fehlt es jedoch. Ich weiß, dass ich Build-Ereignisse in VC++ verwenden kann und dort sowas schreibe

xcopy /y /d %(FullPath) $(OutDir)

Gibt es eine Möglichkeit, die Verwendung von CMD (und anderen Skriptmethoden) zu vermeiden? Kann msbuild in diesem Fall helfen?

50
Loom

Es hängt davon ab, welche Version von Visual Studio Sie verwenden. Das Format der VC++ - Projektdatei in Visual Studio 2008 ist nicht MSBuild. Daher ist die Verwendung von Xcopy in PostBuildStep eine gute Wahl.

Das VC++ - Projekt in Visual Studio 2010 hat das MSBuild-Format. Daher gibt es eine Funktionalität der MSBuild Copy-Aufgabe.

Unten ist ein Beispiel:

<Copy
    SourceFiles="%(FullPath)"
    DestinationFolder="$(OutDir)"
/>

Wenn das Zielverzeichnis nicht vorhanden ist, wird es automatisch erstellt

Eine MSDN Copy-Aufgabenreferenz lautet hier

11
Anton K

Kann MSBuild in diesem Fall helfen?

Mit MSVC 2012 funktionierte dies für mich:

Vorausgesetzt, Sie haben eine Datei "Data/ThisIsData.txt" in Ihrem C++ - Projekt.

Entladen Sie das Projekt (Rechtsklick -> Projekt entladen).
Projekt-XML bearbeiten (Rechtsklick -> Bearbeiten .vcxproj)
Nun sehen Sie die MSBuild-Datei des Projekts als XML in Ihrem Editor.

Suchen Sie nach "ThisIsData.txt". Es sollte ungefähr so ​​aussehen:

<ItemGroup>
<None Include="Data\ThisIsData.txt" />
...
</ItemGroup>

Fügen Sie jetzt eine andere Artikelgruppe hinzu:

<ItemGroup>
<Content Include="Data\ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...
</ItemGroup>

Laden Sie das Projekt neu und bauen Sie es auf.
Ihre Datei "ThisIsData.txt" sollte nach $ (OutDir)\Data\ThisIsData.txt kopiert werden.

Warum die ItemGroup duplizieren?

Wenn Sie einfach das None-Include in ein Content-Include umwandeln, scheint die IDE es nicht mehr zu mögen und zeigt es nicht an. Um eine schnelle Bearbeitungsmöglichkeit für meine Datendateien zu behalten, entschied ich mich, die doppelten Einträge beizubehalten.

87
jochen

In VS 2015 ist es möglich, C-Projekten die Funktionalität zu verleihen, die in C # . Enthalten ist (Idee, die Antwort von Jochen aufzubauen.) .__ Anstatt eine weitere ItemGroup hinzuzufügen, ändern Sie die angegebene Itemgruppe durch Hinzufügen eines CopyTo-Elements. I.E kann anhand seines Beispiels den ursprünglichen Eintrag einfach wie folgt erweitern:

<ItemGroup>
  <None Include="Data\ThisIsData.txt" />
    <DeploymentContent>true</DeploymentContent>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
...
</ItemGroup>

Keine andere ItemGroup erforderlich. Durch das Hinzufügen des CopyTo-Elements fügen Sie die Eigenschaft "Included In Project" hinzu.

 VS 2015 C Property with Included In Project added

17
Henri Socha

Nach der Antwort von henri-socha about VS2015 (und wahrscheinlich VS2013 und VS2012 oder irgendetwas mit MSBuild-Stilprojekten) ist der Elementtyp ItemGroup wichtig.

Konkret scheinen <Text>-Elemente nicht kopiert zu werden, wohingegen <Content>-Elemente dies tun.

Für ein Projektverzeichnis Data, das eine Textdatei ThisIsData.txt enthält, wird ein Unterverzeichnis Data unter dem Verzeichnis $(OutDir) erstellt und die Datei ThisIsData.txt aus dem Verzeichnis kopiert Projekt hinein wenn es neuer ist:

<ItemGroup>
  <Content Include="Data\ThisIsData.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

Dies ist nicht der Fall, obwohl es das ist, was Visual Studio IDE einfügt, wenn Sie Ihrem Projekt die Textdatei hinzufügen und die Content-Eigenschaft auf True setzen.

<ItemGroup>
  <Text Include="Data\ThisIsData.txt">
    <DeploymentContent>true</DeploymentContent>
  </Text>
</ItemGroup>

Mit anderen Worten, Sie müssen die Datei über IDE hinzufügen, damit sie erkennt, dass die Datei im Projekt enthalten ist (wodurch das <Text>-Tag ItemGroup hinzugefügt wird). Öffnen Sie dann das Projekt in einem Texteditor und fügen Sie das <Content>-Tag hinzu ItemGroup, damit es das tut, was Sie wollen.

Ich bin mir nicht sicher, was der Tag <DeploymentContent> tatsächlich tut. Es ist möglicherweise ein Überbleibsel, da die einzige MSDN-Referenz, die ich finden konnte, für archiviert gilt: https://msdn.Microsoft.com/en-us/library/aa712517.aspx

5
WaffleSouffle

In Visual Studio 2017 können Sie dies in der IDE tun. Bei früheren Versionen bin ich mir nicht sicher.

Fügen Sie die Datei einfach als enthaltene Projektdatei hinzu, damit sie im Projektmappen-Explorer angezeigt wird. Klicken Sie dann mit der rechten Maustaste auf die Datei und wählen Sie das Menü Eigenschaften.

Ändern Sie den Inhalt in "Ja" und den Elementtyp in "Datei kopieren".

Wenn Sie sich die an der Projektdatei vorgenommenen Änderungen ansehen, sehen Sie, dass diese hinzugefügt wurden:

<ItemGroup>
  <CopyFileToFolders Include="Filename.txt">
    <DeploymentContent>true</DeploymentContent>
    <FileType>Document</FileType>
  </CopyFileToFolders>
</ItemGroup>
1
Eric

In Visual Studio 2019 können Sie nach dem Festlegen der Datei als "In Projekt einbeziehen" die Eigenschaften bearbeiten und als Elementtyp "Datei kopieren" auswählen (siehe https://i.stack.imgur.com/vac2b. png ) Dies vermeidet die manuelle Bearbeitung der vcxproj-Datei.

1
Jacq

Sie können das Kopieren in der Projektdatei angeben, als Jeff G antwortete in einer anderen Frage:

Ändern Sie in der Datei *.vcxproj Folgendes:

<Text Include="Filename.txt" />

zu:

<Content Include="Filename.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

Ändern Sie dann in der Datei *.vcxproj.filters Folgendes:

<Text Include="Filename.txt">
    <Filter>Resource Files</Filter>
</Text>

zu:

<Content Include="Filename.txt">
    <Filter>Resource Files</Filter>
</Content>

wo das <Text ...>-Tag für angegebene Textdateien ist (es wird <Image ...> für Bilddateien usw. sein)

0
kjhf