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
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)
.
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>
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>
<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 ...
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
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
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.
Personnellement, j'ai utilisé CopyFolder qui fait partie de la bibliothèque de tâches SDC.
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.