MSBuild - 子目录中所有bin目录的ItemGroup

dar*_*ect 5 msbuild itemgroup

我的解决方案有多个项目(以及子目录),每个项目文件夹中都有一个"bin"文件夹.

我正在尝试在MSBuild脚本中创建一个包含所有这些目录的ItemGroup.

我认为这就足够了,但它不包含任何东西:

<ItemGroup>
  <BinDirs Include="**\bin" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

我不确定为什么这不起作用.任何人都可以指出我正确的方向来实现我想要做的事情吗?

问候,尼克

小智 16

由于这还没有得到答案,但在Google搜索结果列表中名列前茅:

Alexey提供的链接有几个答案可以解决这个问题,但是为什么你给出的例子不起作用并不明显.

在定位目录时,MSBuild ItemGroup集合似乎不喜欢通配符转换.

您可以使用显式路径,例如

<ItemGroup>
  <BinDirs Include="C:\MyProject\bin" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

或者相对于构建脚本运行位置的路径,例如

<ItemGroup>
  <BinDirs Include="..\MyProject\bin" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

但是,除非您定位文件,否则它不会转换您的通配符,例如

<ItemGroup>
  <ThisWorks Include="..\**\bin\*" />
  <ThisDoesnt Include="..\**\bin" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

该帖子包含几种使用通配符选择文件夹的方法,我倾向于使用它:

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

如帖子所述,它在选择根文件夹方面并不完美,因为它必须找到有文件的位置.使用bin*.*只会在文件位于bin文件夹中时获取bin文件夹.

如果您的构建类似于标准VS输出,您可能会发现您的bin文件夹没有文件,而是根据您的配置名称具有目录,例如bin\Debug,在这种情况下,目标bin\**\*将导致您的包含这些文件夹的项目组.

例如

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

将得到:

  • ..\Proj1\BIN \调试
  • ..\Proj1\BIN \发布
  • ..\Proj2\BIN \调试
  • ..\Proj2\BIN \发布

我不知道有一种通配符方式来获取没有文件的bin文件夹...... 如果有人找到,请发布,因为它会有用.

希望这可以帮助别人节省一些时间.


Cri*_*n T 9

在MSBuild 4.0中,这是可能的:

<Folders Include="$([System.IO.Directory]::GetDirectories(&quot;.&quot;,&quot;Bin&quot;, SearchOption.AllDirectories))" />
Run Code Online (Sandbox Code Playgroud)