Просто интересно, может ли кто-нибудь помочь мне с некоторыми скриптами msbuild, которые я пытаюсь написать. Я бы хотел скопировать все файлы и подпапки из папки в другую с помощью msbuild.
{ProjectName}
|----->Source
|----->Tools
|----->Viewer
|-----{about 5 sub dirs}
Что мне нужно сделать, так это скопировать все файлы и подпапки из папки инструментов в папку отладки приложения. Это код, который у меня есть.
<ItemGroup>
<Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" />
</ItemGroup>
<Target Name="BeforeBuild">
<Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" />
</Target>
Сценарий сборки запускается, но не копирует никакие файлы или папки.
Благодарность
scripting
msbuild
build-process
build
Натан В
источник
источник
%(RecursiveDir)
в папку назначения воссоздает структуру каталогов. В противном случае результат будет плоским. Это лучший ответ.%(RecursiveDir)
в MSBuild метаданные хорошо известных элементов : docs.microsoft.com/en-us/visualstudio/msbuild/…Я думаю, проблема может заключаться в том, как вы создаете свою ItemGroup и вызываете задачу копирования. Посмотрите, имеет ли это смысл:
<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>
источник
CreateItem
задача устарела. у регулярного выражения есть альтернатива. msdn.microsoft.com/en-us/library/s2y3e43x.aspxЯ новичок в MSBuild, но считаю, что задача EXEC подходит для подобных ситуаций. Я столкнулся с той же проблемой в своем проекте, и это сработало для меня и было намного проще. Кто-нибудь, пожалуйста, дайте мне знать, если это не очень хорошая практика.
<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite"> <Exec Command="xcopy.exe $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" /> </Target>
источник
Copy
задачу вместо команды - совместимость. Я раньше строил Linux с использованием Mono и, очевидно,xcopy
там не работал.<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>
\**\*.*
Помогите получить файлы из всей папки. RecursiveDir поможет поместить весь файл в соответствующую папку ...источник
CreateItem
задача устарела. у регулярного выражения есть альтернатива. msdn.microsoft.com/en-us/library/s2y3e43x.aspxВы пытались указать конкретный целевой каталог вместо
Я не очень разбираюсь в расширенном синтаксисе MSBuild, но
мне кажется странным. Скрипт выглядит неплохо, поэтому проблема может заключаться в значениях
$(ApplicationDirectory)
и$(OutputPath)
РЕДАКТИРОВАТЬ:
Вот запись в блоге, которая может быть полезна:
Как: рекурсивно копировать файлы с помощью задачи
источник
Вот пример, который сработал:
<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>
источник: https://msdn.microsoft.com/en-us/library/3e54c37h.aspx
источник
Это задача копирования, которую я использовал в своем собственном проекте, она отлично работала для меня, успешно копируя папку с подпапками в место назначения:
<ItemGroup > <MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" /> </ItemGroup> <Target Name="AfterCopy" AfterTargets="WebPublish"> <Copy SourceFiles="@(MyProjectSource)" OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/>
В моем случае я скопировал папку публикации проекта в другую папку назначения, я думаю, что это похоже на ваш случай.
источник
Лично я использовал CopyFolder, который является частью библиотеки задач SDC.
http://sdctasks.codeplex.com/
источник
Лучший способ рекурсивно копировать файлы из одного каталога в другой с помощью MSBuild - использовать задачу копирования с параметрами SourceFiles и DestinationFiles. Например - для копирования всех файлов из каталога сборки в каталог резервного копирования будет
<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>
Теперь в приведенной выше команде копирования просматриваются все исходные каталоги, а файлы копируются в целевой каталог.
источник
Если вы работаете с типичной цепочкой инструментов C ++, другой способ - добавить файлы в стандартный список CopyFileToFolders.
<ItemGroup> <CopyFileToFolders Include="materials\**\*"> <DestinationFolders>$(MainOutputDirectory)\Resources\materials\%(RecursiveDir)</DestinationFolders> </CopyFileToFolders> </ItemGroup>
Помимо простоты, это хороший способ, потому что задача CopyFilesToFolders будет генерировать соответствующие входные, выходные и даже файлы TLog, поэтому убедитесь, что операции копирования будут выполняться только тогда, когда один из входных файлов изменился или один из выходных файлов отсутствует. С TLog Visual Studio также правильно распознает проект как «обновленный» или нет (для этого используется отдельный механизм U2DCheck).
источник