Создание списка папок в группе элементов с помощью MSBuild
Я пытаюсь создать ItemGroup в MSBuild script, который содержит список папок непосредственно под данной папкой "Root". Итак - в этом примере...
+ Root folder
---- Sub Folder 1
-------- Sub-Sub Folder 1
-------- Sub-Sub Folder 2
---- Sub Folder 2
---- Sub Folder 3
... Я бы хотел, чтобы моя ItemGroup содержала "Sub Folder 1", "Sub Folder 2" и "Sub Folder 3".
В любой точке иерархии может быть несколько файлов, но меня интересуют только папки.
Может кто-нибудь помочь!?
Ответы
Ответ 1
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)\**\*"/>
<OnlyDirs Include="@(AllFiles->'%(Directory)')"/>
</ItemGroup>
@(OnlyDirs) может содержать дубликаты, поэтому вы можете либо использовать RemoveDuplicatesTask:
<Target Name="foo">
<RemoveDuplicates Inputs="@(OnlyDirs)">
<Output TaskParameter="Filtered" ItemName="UniqueDirs"/>
</RemoveDuplicates>
</Target>
или используйте CreateItem с пакетной загрузкой для% (AllFiles.Identity) или с помощью msbuild 3.5:
<Target Name="foo">
<ItemGroup>
<UniqueDirs Include="%(AllFiles.Directory)"/>
</ItemGroup>
</Target>
Ответ 2
В MSBuild 4.0 это возможно:
<ItemGroup>
<Folders Include="$([System.IO.Directory]::GetDirectories("$(RootFolder)"))" />
</ItemGroup>
Функции свойства: http://msdn.microsoft.com/en-us/library/dd633440.aspx
Ответ 3
MSBuild Extension pack имеет задачу с именем FindUnder
, которая возвращает группу элементов файлов или папок под определенным путем. Следующее задание достигнет того, чего вы хотите, возвращая группу элементов, содержащую подпапку 1, подпапку 2 и подпапку 3, но не подпапку 1 или под-подпапку 2:
<MSBuild.ExtensionPack.FileSystem.FindUnder
TaskAction="FindDirectories"
Path="$(RootFolder)"
Recursive="False">
<Output ItemName="FoundFolders" TaskParameter="FoundItems" />
</MSBuild.ExtensionPack.FileSystem.FindUnder>
Ответ 4
MSBuild 4.0:
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)\**\*"/>
<OnlyDirs Include="@(AllFiles->'%(RootDir)%(Directory)'->Distinct())"/>
</ItemGroup>
Ответ 5
Этот пост форума MSDN имеет настраиваемую задачу, которая имеет дело с пустым случаем каталога (рекомендуется использовать его как полезный ответ)