我的解决方案有多个项目(因此有子目录),每个项目文件夹中都有一个“bin”文件夹。
我正在尝试在包含所有这些目录的 MSBuild 脚本中创建一个 ItemGroup。
我认为这已经足够了,但它不包含任何内容:
<ItemGroup>
<BinDirs Include="**\bin" />
</ItemGroup>
我不确定为什么这不起作用。谁能指出我正确的方向来实现我想要做的事情?
问候,尼克
由于这没有得到答案,但在 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>
将得到:
我不知道有一种通配符方法来获取没有文件的 bin 文件夹......但是。如果有人找到了,请发布,因为它会很有用。
希望这可以帮助某人节省一些时间。
在 MSBuild 4.0 中,这是可能的:
<Folders Include="$([System.IO.Directory]::GetDirectories(".","Bin", SearchOption.AllDirectories))" />