在MSBuild 12.0中,我是否可以仅在满足条件时将文件包含在<ItemGroup>
中?
我的用例是我想创建一个所有.csproj
个文件的集合,其中存在一个具有相同名称的.nuspec
文件(没有扩展名)。
- root_dir\
- build.proj
- Project1\
- Project1.csproj
- Project1.nuspec
- Project2\
- Project2.csproj
- Project3\
- Project3.csproj
- Project3.nuspec
我尝试使用MSBuild转换执行此操作,但这不起作用。
<ItemGroup>
<ProjectWithNuspec Include="*\*.csproj"
Condition="Exists('@(ProjectWithNuspec->'%(Filename).nuspec')')">
</ItemGroup>
在评估条件之前,似乎没有初始化项ProjectWithNuspec
。
我确实找到了分两步完成的方法:
<ItemGroup>
<ProjectWithNuspec Include="*\*.csproj">
<ProjectWithNuspec Remove="%(ProjectWithNuspec.Identity)"
Condition="!Exists('@(ProjectWithNuspec->'%(Filename).nuspec')')">
</ItemGroup>
理想情况下,我希望能够一步到位。
答案 0 :(得分:6)
您基本上这样做是可以在MSBuild中表达的最佳方式。对于这些类型的变换,您几乎总是需要一个中间项组,您可以将其他变换分层。把它想象成一个管道,首先你需要所有文件(这些都进入组1),现在我需要组1中的所有文件,这些文件也与其他条件相匹配(组2)。
<ItemGroup>
<AllProjects Include="$(MyDir)\**\*.csproj" />
<AllProjectsWithNuspec Include="@(AllProjects)"
Condition="Exists('%(RecursiveDir)%(FileName).nuspec')" />
</ItemGroup>
答案 1 :(得分:0)
条件元素可用于正则表达式。 请参阅this answer。