5

我的解决方案有多个项目(因此有子目录),每个项目文件夹中都有一个“bin”文件夹。

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

我认为这已经足够了,但它不包含任何内容:

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

我不确定为什么这不起作用。谁能指出我正确的方向来实现我想要做的事情?

问候,尼克

4

2 回答 2

16

由于这没有得到答案,但在 Google 结果列表中排名靠前:

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

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

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

希望这可以帮助某人节省一些时间。

于 2013-06-22T16:06:28.337 回答
11

在 MSBuild 4.0 中,这是可能的:

<Folders Include="$([System.IO.Directory]::GetDirectories(&quot;.&quot;,&quot;Bin&quot;, SearchOption.AllDirectories))" />
于 2013-12-19T09:53:33.587 回答