webentwicklung-frage-antwort-db.com.de

Kopieren Sie alle Dateien und Ordner mit msbuild

Ich frage mich nur, ob mir jemand mit einigen msbuild-Skripten helfen könnte, die ich zu schreiben versuche. Ich möchte alle Dateien und Unterordner mit msbuild von einem Ordner in einen anderen Ordner kopieren.

{ProjectName}
      |----->Source
      |----->Tools
              |----->Viewer
                       |-----{about 5 sub dirs}

Ich muss in der Lage sein, alle Dateien und Unterordner aus dem Tools-Ordner in den Debug-Ordner für die Anwendung zu kopieren. Dies ist der Code, den ich bisher habe.

 <ItemGroup>
<Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" />
 </ItemGroup>

<Target Name="BeforeBuild">
        <Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" />
  </Target>

Das Build-Skript wird ausgeführt, kopiert jedoch keine Dateien oder Ordner.

Vielen Dank

78
Nathan W

Ich habe auch hier nach Hilfe gesucht. Es hat eine Weile gedauert, aber hier ist, was ich getan habe, das hat wirklich gut funktioniert.

<Target Name="AfterBuild">
    <ItemGroup>
        <ANTLR Include="..\Data\antlrcs\**\*.*" />
    </ItemGroup>
    <Copy SourceFiles="@(ANTLR)" DestinationFolder="$(TargetDir)\%(RecursiveDir)" SkipUnchangedFiles="true" />
</Target>

Dies kopierte rekursiv den Inhalt des Ordners mit dem Namen antlrcs in die Funktion $(TargetDir).

110
Rodolfo Neuber

Ich denke, das Problem könnte darin liegen, wie Sie Ihre ItemGroup erstellen und die Kopieraufgabe aufrufen. Sehen Sie, ob dies sinnvoll ist:

<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <PropertyGroup>
        <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
        <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
    </PropertyGroup>

    <Target Name="BeforeBuild">
        <CreateItem Include="$(YourSourceDirectory)\**\*.*">
            <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
        </CreateItem>

        <Copy SourceFiles="@(YourFilesToCopy)"
                DestinationFiles="@(YourFilesToCopy->'$(YourDestinationDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" />
    </Target>
</Project>
70
brock.holum

Ich bin ein bisschen neu in MSBuild, aber ich finde die EXEC-Aufgabe für Situationen wie diese praktisch. Ich bin in meinem Projekt auf die gleiche Herausforderung gestoßen, und das hat bei mir funktioniert und war viel einfacher. Jemand, lass es mich bitte wissen, wenn es keine gute Übung ist.

<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite">
    <Exec Command="xcopy.exe  $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" />
</Target>
35
Denzil Brown
<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <PropertyGroup>
        <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
        <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
    </PropertyGroup>

    <Target Name="BeforeBuild">
        <CreateItem Include="$(YourSourceDirectory)\**\*.*">
            <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
        </CreateItem>

        <Copy SourceFiles="@(YourFilesToCopy)"
                DestinationFiles="$(YourFilesToCopy)\%(RecursiveDir)" />
    </Target>
</Project>

\**\*.* Hilfe zum Abrufen von Dateien aus allen Ordnern. RecursiveDir-Hilfe, um alle Dateien in den entsprechenden Ordner zu legen ...

10
amit thakur

Haben Sie versucht, ein konkretes Zielverzeichnis anstelle von anzugeben?

DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" ? 

Ich bin nicht sehr kompetent mit fortgeschrittener MSBuild-Syntax, aber

@(Viewer->'$(OutputPath)\\Tools') 

sieht komisch aus für mich. Das Skript sieht gut aus, daher liegt das Problem möglicherweise bei den Werten $(ApplicationDirectory) und $(OutputPath).

BEARBEITEN:

Hier ist ein Blog-Beitrag, der nützlich sein könnte:

How To: Rekursives Kopieren von Dateien mit der Task

4
aku

Dies ist das Beispiel, das funktioniert hat:

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">

   <ItemGroup>
      <MySourceFiles Include="c:\MySourceTree\**\*.*"/>
   </ItemGroup>

   <Target Name="CopyFiles">
      <Copy
        SourceFiles="@(MySourceFiles)"
        DestinationFiles="@(MySourceFiles->'c:\MyDestinationTree\%(RecursiveDir)%(Filename)%(Extension)')"
       />
    </Target>

</Project>

quelle: https://msdn.Microsoft.com/en-us/library/3e54c37h.aspx

2
PBo

Dies ist eine Kopieraufgabe, die ich in meinem eigenen Projekt verwendet habe. Sie funktionierte perfekt für mich und kopiert Ordner mit Unterordnern erfolgreich an das Ziel:

<ItemGroup >
<MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" />
</ItemGroup>

<Target Name="AfterCopy" AfterTargets="WebPublish">
<Copy SourceFiles="@(MyProjectSource)" 
 OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/>

In meinem Fall habe ich den Veröffentlichungsordner eines Projekts in einen anderen Zielordner kopiert. Ich denke, das ist ähnlich wie in Ihrem Fall.

1
nzrytmn

Persönlich habe ich CopyFolder verwendet, das Teil der SDC Tasks Library ist.

http://sdctasks.codeplex.com/

1
Johan

Der beste Weg, Dateien mithilfe von MSBuild rekursiv von einem Verzeichnis in ein anderes zu kopieren, ist die Verwendung der Aufgabe Kopieren mit SourceFiles und DestinationFiles als Parametern. Zum Beispiel - Um alle Dateien aus dem Build-Verzeichnis in das Backup-Verzeichnis zu kopieren

<PropertyGroup>
<BuildDirectory Condition="'$(BuildDirectory)' == ''">Build</BuildDirectory>
<BackupDirectory Condition="'$(BackupDiretory)' == ''">Backup</BackupDirectory>
</PropertyGroup>

<ItemGroup>
<AllFiles Include="$(MSBuildProjectDirectory)/$(BuildDirectory)/**/*.*" />
</ItemGroup>

<Target Name="Backup">
<Exec Command="if not exist $(BackupDirectory) md $(BackupDirectory)" />
<Copy SourceFiles="@(AllFiles)" DestinationFiles="@(AllFiles-> 
'$(MSBuildProjectDirectory)/$(BackupDirectory)/%(RecursiveDir)/%(Filename)% 
(Extension)')" />
</Target>

Nun werden im obigen Befehl Kopieren alle Quellverzeichnisse durchlaufen und Dateien in das Zielverzeichnis kopiert.

0