ItemGroup 包含有条件的文件
ItemGroup include files with condition
在 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>
理想情况下,我希望能够一步完成。
您基本上是以 MSBuild 中可以表达的最佳方式来执行此操作。对于这些类型的转换,您几乎总是需要一个中间项目组,您可以将其他转换分层到该中间项目组。把它想象成一个管道,首先你需要所有文件(这些文件进入第 1 组),现在我需要第 1 组中的所有文件,这些文件也符合其他一些条件(第 2 组)。
<ItemGroup>
<AllProjects Include="$(MyDir)\**\*.csproj" />
<AllProjectsWithNuspec Include="@(AllProjects)"
Condition="Exists('%(RecursiveDir)%(FileName).nuspec')" />
</ItemGroup>
Condition元素可以使用正则表达式。
请参考.
在 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>
理想情况下,我希望能够一步完成。
您基本上是以 MSBuild 中可以表达的最佳方式来执行此操作。对于这些类型的转换,您几乎总是需要一个中间项目组,您可以将其他转换分层到该中间项目组。把它想象成一个管道,首先你需要所有文件(这些文件进入第 1 组),现在我需要第 1 组中的所有文件,这些文件也符合其他一些条件(第 2 组)。
<ItemGroup>
<AllProjects Include="$(MyDir)\**\*.csproj" />
<AllProjectsWithNuspec Include="@(AllProjects)"
Condition="Exists('%(RecursiveDir)%(FileName).nuspec')" />
</ItemGroup>
Condition元素可以使用正则表达式。
请参考