Einschließlich Inhaltsdateien in CSPROJ, die außerhalb des Projekts Kegel sind

StackOverflow https://stackoverflow.com/questions/1292351

  •  18-09-2019
  •  | 
  •  

Frage

Ich habe eine C # -Projekt sagt MyProject.csproj gefunden in "C: \ Projects \ MyProject \". Ich habe auch Dateien, die ich in das Ausgabeverzeichnis des Projekts kopiert werden sollen. Aber, sind die Dateien, an der Stelle „C: \ MyContentFiles \“, das heißt, sie nicht innerhalb des Projekts Kegel sind. Dieses Verzeichnis hat Unterverzeichnisse als auch. Der Inhalt des Verzeichnisses wird nicht verwaltet. Daher muss ich alle sind, was darunter ist.

Als ich sie als ‚Inhalt‘ in dem Projekt sind, werden sie kopiert, aber die Verzeichnisstruktur verloren geht. Ich habe so etwas wie folgt aus: -

<Content Include="..\..\MyContentFiles\**">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

Wie kopiere ich diese Dateien / Verzeichnisse rekursiv in das Ausgabeverzeichnis des Projektes mit der Verzeichnisstruktur erhalten?

War es hilfreich?

Lösung

Sie müssen Datei als Link hinzuzufügen:

  1. Rechtsklick auf das Projekt in VS.
  2. Add -> Existing Item ...
  3. Suchen Sie die Datei.
  4. Wählen Sie und.
  5. Fügen Sie als Link (Drop-Down in der Schaltfläche Hinzufügen im Dialog).
  6. Sie die Eigenschaften der Datei öffnen und „kopieren Output Directory“ auf „Kopieren immer“ gesetzt.

Sie können sie jedoch für den Verzeichnisbaum nicht.
Stattdessen müssen Sie Post-Build-Aufgabe für das schreiben. Dies ist ein Beispiel , die Sie starrte erhalten.

Andere Tipps

Ich glaube, @Dmytrii es direkt an einer Hand bekommt - Sie können den "Link" -Funktion verwenden möchten

.

Doch er ist nur zum Teil richtig, wenn Sie sagen, nicht zu einem Verzeichnisbaum verknüpfen. Während dies ist in der Tat wahr, wenn man versucht die Links hinzufügen Visual Studio GUI, MSBuild unterstützt dies.

Wenn Sie die Verzeichnisstruktur beibehalten möchten, fügen Sie einfach den %(RecursiveDir) Tag zu Ihrem <link> Knoten:

<Content Include="..\..\MyContentFiles\**\*.*">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

Die Seite MSBuild Bekannte Artikel Metadaten auf die mehr ins Detail geht Metadaten können Sie zugreifen.

Die Antwort von Mandark fügt die Inhaltsdateien direkt auf die Lösung, und sie werden in der Lösung Explorer angezeigt. Jedes Mal, wenn eine Datei hinzugefügt oder im ursprünglichen Verzeichnis gelöscht, wird dies nicht automatisch von Visual Studio abgeholt. Auch wenn eine Datei gelöscht oder in der Lösung Explorer hinzugefügt, die Projektdatei geändert wird, und alle Dateien werden separat enthalten, statt nur mit den Ordnern aus.

Um dies zu verhindern, können Sie den gleichen Trick verwenden, aber in einer separaten Projektdatei setzen und dann importieren.

Die Projektdatei (zB include.proj) sieht wie folgt aus:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="..\..\MyContentFiles\**">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

In Ihrer eigenen Projektdatei, fügen Sie die folgende Zeile

<Import Project="include.proj" />

Visual Studio wird nicht verwirren mit dieser Datei und fügt nur Dateien als Inhalt während eines Build. Änderungen im ursprünglichen Verzeichnis sind immer inbegriffen. Die Dateien werden nicht angezeigt in Ihrer Lösung Explorer, werden aber im Ausgabeverzeichnis aufgenommen werden.

auf diesem Trick Nimmt: http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx

Die folgende, die Sie auf die Unterseite Ihrer Projektdatei hinzufügen würden, wird Ihre Inhaltsdateien Beibehaltung der Verzeichnisstruktur in einem nach bauen Ereignisse in das Zielverzeichnis $(TargetDirectory) des Build (typischerweise $(MSBuildProjectDirectory)\bin\Debug) kopieren.

<ItemGroup>
    <ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" />
</ItemGroup>

<Target Name="AfterBuild">
    <Copy 
        SourceFiles="@(ExtraContent)" 
        DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
        SkipUnchangedFiles="true" />
</Target>

Wenn diese Dateien in einem Verzeichnis mit dem Namen MyContentFiles gehen müssen, kann man diese hinzufügen, bevor die Kopie:

<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />

und ändern

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

Ich denke

<Content Include="..\..\MyContentFiles\**\*.*">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

Ist gerade genug, da man alles in diesem Ordner und Unterordner möchten

Um Dateien in einem Ordner für ein .NET-Core-Projekt gehört,

<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

und die Eigenschaft "Copy to Output Directory" Artikel wird "Kopieren, falls neuere":
Kopieren, falls neuere

Um eine Datei in einem .NET-Core-Projekt zu ignorieren:

<ItemGroup>
 <Content Include="appsettings.local.json">
   <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory>
 </Content>
</ItemGroup>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top