MSBuild - 子目录中所有 bin 文件夹的 ItemGroup

6
我的解决方案有多个项目(因此有子目录),每个项目文件夹中都有一个“bin”文件夹。
我正在尝试在我的MSBuild脚本中创建一个ItemGroup,其中包括所有这些目录。
我原以为以下代码足够了,但它并没有包含任何内容:
<ItemGroup>
  <BinDirs Include="**\bin" />
</ItemGroup>

我不确定为什么这个不起作用。有人可以指点我如何实现我想做的吗?

谢谢, Nick


请查看这个问题:https://dev59.com/nXI-5IYBdhLWcg3w0cGG - Alexey Shcherbak
2个回答

17

由于这个问题还没有答案,但在谷歌搜索结果中排名很高:

Alexey提供的链接有几个解决此问题的答案,但不清楚为什么你提供的示例不起作用。

当针对目录时,MSBuild ItemGroup集合似乎不喜欢通配符转换。

您可以使用明确的路径,例如:

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

或相对于您的构建脚本运行的路径,例如:

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

然而,除非您的目标是文件,否则它不会转换通配符,例如:

However it does not transform your wildcards unless you are targeting files, e.g.
<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

我不知道如何以通配符的方式获取没有文件的bin文件夹,如果有人找到了一种方法,请发布出来,因为这将非常有用。

希望这能帮助某些人节省时间。


如果子文件夹为空,则会失败 :( - Mrchief

13

在 MSBuild 4.0 中,这是可能的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接