web-dev-qa-db-fra.com

Copiez tous les fichiers et dossiers à l'aide de msbuild

Je me demande simplement si quelqu'un pourrait m'aider avec certains scripts msbuild que j'essaie d'écrire. Ce que je voudrais faire, c'est copier tous les fichiers et sous-dossiers d'un dossier vers un autre dossier en utilisant msbuild.

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

Ce que je dois pouvoir faire, c'est copier tous les fichiers et sous-dossiers du dossier tools dans le dossier de débogage de l'application. C'est le code que j'ai jusqu'à présent.

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

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

Le script de génération s'exécute mais ne copie aucun des fichiers ou dossiers.

Merci

78
Nathan W

Je cherchais aussi de l'aide à ce sujet. Cela m'a pris du temps, mais voici ce que j'ai fait qui a très bien fonctionné.

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

Cela copiait récursivement le contenu du dossier nommé antlrcs dans la $(TargetDir).

110
Rodolfo Neuber

Je pense que le problème pourrait être dans la façon dont vous créez votre ItemGroup et appelez la tâche de copie. Voyez si cela a du sens:

<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

Je suis un peu nouveau sur MSBuild mais je trouve la tâche EXEC pratique pour une situation comme celle-ci. J'ai rencontré le même défi dans mon projet et cela a fonctionné pour moi et était beaucoup plus simple. Quelqu'un, s'il vous plaît, faites-moi savoir si ce n'est pas une bonne pratique.

<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>

\**\*.* aide à récupérer les fichiers de tout le dossier. Aide RecursiveDir pour mettre tous les fichiers dans le dossier respectif ...

10
amit thakur

Avez-vous essayé de spécifier un répertoire de destination concret au lieu de

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

Je ne suis pas très compétent avec la syntaxe MSBuild avancée, mais

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

me semble bizarre. Le script semble bon, donc le problème pourrait être dans les valeurs de $(ApplicationDirectory) et $(OutputPath)

MODIFIER:

Voici un article de blog qui pourrait être utile:

Comment: copier récursivement des fichiers à l'aide de la tâche

4
aku

Voici l'exemple qui a fonctionné:

<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>

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

2
PBo

C'est la tâche de copie que j'ai utilisée dans mon propre projet, cela fonctionnait parfaitement pour moi qui copie le dossier avec les sous-dossiers vers la destination avec succès:

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

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

Dans mon cas, j'ai copié le dossier de publication d'un projet dans un autre dossier de destination, je pense qu'il est similaire à votre cas.

1
nzrytmn

Personnellement, j'ai utilisé CopyFolder qui fait partie de la bibliothèque de tâches SDC.

http://sdctasks.codeplex.com/

1
Johan

La meilleure façon de copier récursivement des fichiers d'un répertoire à un autre à l'aide de MSBuild est d'utiliser la tâche Copier avec SourceFiles et DestinationFiles comme paramètres. Par exemple - Copier tous les fichiers du répertoire de construction vers le répertoire de sauvegarde sera

<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>

Maintenant, dans la commande Copier ci-dessus, tous les répertoires source sont parcourus et les fichiers sont copiés dans le répertoire de destination.

0
shivinder thakur