MSBuild - ItemGroup всех каталогов bin в подкаталогах

В моем решении есть несколько проектов (и, следовательно, подкаталогов), и в каждой папке проекта есть папка 'bin'.

Я пытаюсь создать ItemGroup в моем скрипте MSBuild, который включает в себя все эти каталоги.

Я думал, что этого будет достаточно, но в нем ничего нет:

<ItemGroup>
  <BinDirs Include="**\bin" />
</ItemGroup>

Я не уверен, почему это не работает. Может ли кто-нибудь указать мне правильное направление для достижения того, что я пытаюсь сделать?

С уважением, Ник

2 ответа

Решение

Так как на этот вопрос нет ответа, он все еще стоит в списке результатов Google:

Ссылка, предоставленная Алексеем, содержит несколько ответов, чтобы обойти эту проблему, но не очевидно, почему приведенный вами пример не работает.

Похоже, что коллекции MSBuild ItemGroup не похожи на групповые преобразования при нацеливании на каталоги.

Вы можете использовать явные пути, например,

<ItemGroup>
  <BinDirs Include="C:\MyProject\bin" />
</ItemGroup>

Или пути относительно того, где работает ваш скрипт сборки, например

<ItemGroup>
  <BinDirs Include="..\MyProject\bin" />
</ItemGroup>

Однако он не преобразует ваши шаблоны, если вы не нацелены на файлы, например

<ItemGroup>
  <ThisWorks Include="..\**\bin\*" />
  <ThisDoesnt Include="..\**\bin" />
</ItemGroup>

Этот пост содержит несколько способов выбора папок с использованием подстановочных знаков, один из которых я обычно использую:

<ItemGroup>
  <GetAllFiles Include="..\**\bin\*.*" />
  <GetFolders Include="@(GetAllFiles->'%(RootDir)%(Directory)'->Distinct())" />
</ItemGroup>

Как отмечается в посте, он не идеален при выборе корневых папок, так как он должен найти, где находятся файлы. Использование bin*.* Получит папку bin только в том случае, если в ней находятся файлы.

Если ваша сборка похожа на стандартный вывод VS, вы, вероятно, обнаружите, что в папке bin нет файлов, вместо этого есть каталоги, основанные на именах вашей конфигурации, например, bin\Debug, и в этом случае нацеливание на bin\**\* приведет к вашему группа элементов, содержащая эти папки.

Например

<ItemGroup>
  <GetAllFiles Include="..\**\bin\**\*" />
  <GetFolders Include="@(GetAllFiles->'%(RootDir)%(Directory)'->Distinct())" />
</ItemGroup>

Мог получить:

  • .. \ proj1\ Bin \ Debug
  • .. \ proj1\ Bin\Release
  • .. \ proj2\ Bin \ Debug
  • .. \ proj2\ Bin\Release

Я не знаю подстановочного способа получить папки бина без файлов в... пока. Если кто-нибудь найдет его, пожалуйста, напишите, как это было бы полезно.

Надеюсь, это поможет кому-то сэкономить время.

В MSBuild 4.0 это возможно:

<Folders Include="$([System.IO.Directory]::GetDirectories(&quot;.&quot;,&quot;Bin&quot;, SearchOption.AllDirectories))" />
Другие вопросы по тегам