msbuild 从 属性 组创建项目组
msbuild create itemgroup from property group
我想传递一个以分号分隔的字符串列表。
每个字符串代表一个文件名。
<PropertyGroup>
<FileNames>Newtonsoft.Json;Reactive</FileNames>
<PathToOutput>C:/</PathToOutput>
</PropertyGroup>
现在我想创建一个项目组,它应该给我特定文件夹中的所有文件,不包括文件名列表,例如:
<ItemGroup>
<ReleaseFiles Include="$(PathToOutput)\**\*.*" Exclude="%(identity)-> identity.contains(%FileNames)"/>
</ItemGroup>
如果文件名变量中包含任何一个文件名,我如何遍历当前文件夹的文件并匹配每个文件名。
很确定这是重复的,但我现在找不到它所以在这里:
- 将分号分隔的 属性 变成一个项目只是使用
Include=$(Property)
的问题
Exclude
只有在你有一个完全匹配的列表时才有效,但你需要在这里进行更多的任意过滤,所以你需要 Condition
- 通过制作 ReleaseFiles 项目的那些 FileNames 元数据,将两个 ItemGroup 像叉积一样连接在一起。然后您可以遍历 ReleaseFiles 中的每个项目并同时访问 FileNames
Contains
是一个 属性 函数(好吧,或者是一个 System::String 方法)所以在元数据上不能这样工作,因此我们首先将元数据转换成字符串
在代码中:
<PropertyGroup>
<FileNames>Newtonsoft.Json;Reactive</FileNames>
<PathToOutput>C:/</PathToOutput>
</PropertyGroup>
<Target Name="FilterBasedCommaSeperatedProperty">
<ItemGroup>
<!-- property -> item -->
<Excl Include="$(FileNames)"/>
<!-- list all and add metadata list -->
<AllReleaseFiles Include="$(PathToOutput)\**\*.*">
<Excl>%(Excl.Identity)</Excl>
</AllReleaseFiles >
<!-- filter to get list of files we don't want -->
<FilesToExclude Include="@(AllReleaseFiles)"
Condition="$([System.String]::Copy('%(FileName)').Contains('%(Excl)'))"/>
<!-- all but the ones to exclude -->
<ReleaseFiles Include="@(AllReleaseFiles)" Exclude="@(FilesToExclude)"/>
</ItemGroup>
<Message Text="%(ReleaseFiles.Identity)" />
</Target>
使用标准方法从项目组中排除文件文件,方法是使用排除属性并引用另一个项目组。它会更容易理解。
示例:
<PropertyGroup>
<PathToOutput>C:/</PathToOutput>
</PropertyGroup>
<ItemGroup>
<FilesToExclude Include="$(PathToOutput)\**\Newtonsoft.Json" />
<FilesToExclude Include="$(PathToOutput)\**\Reactive" />
<ReleaseFiles Include="$(PathToOutput)\**\*.*" Exclude="@(FilesToExclude)"/>
</ItemGroup>
我想传递一个以分号分隔的字符串列表。
每个字符串代表一个文件名。
<PropertyGroup>
<FileNames>Newtonsoft.Json;Reactive</FileNames>
<PathToOutput>C:/</PathToOutput>
</PropertyGroup>
现在我想创建一个项目组,它应该给我特定文件夹中的所有文件,不包括文件名列表,例如:
<ItemGroup>
<ReleaseFiles Include="$(PathToOutput)\**\*.*" Exclude="%(identity)-> identity.contains(%FileNames)"/>
</ItemGroup>
如果文件名变量中包含任何一个文件名,我如何遍历当前文件夹的文件并匹配每个文件名。
很确定这是重复的,但我现在找不到它所以在这里:
- 将分号分隔的 属性 变成一个项目只是使用
Include=$(Property)
的问题
Exclude
只有在你有一个完全匹配的列表时才有效,但你需要在这里进行更多的任意过滤,所以你需要Condition
- 通过制作 ReleaseFiles 项目的那些 FileNames 元数据,将两个 ItemGroup 像叉积一样连接在一起。然后您可以遍历 ReleaseFiles 中的每个项目并同时访问 FileNames
Contains
是一个 属性 函数(好吧,或者是一个 System::String 方法)所以在元数据上不能这样工作,因此我们首先将元数据转换成字符串
在代码中:
<PropertyGroup>
<FileNames>Newtonsoft.Json;Reactive</FileNames>
<PathToOutput>C:/</PathToOutput>
</PropertyGroup>
<Target Name="FilterBasedCommaSeperatedProperty">
<ItemGroup>
<!-- property -> item -->
<Excl Include="$(FileNames)"/>
<!-- list all and add metadata list -->
<AllReleaseFiles Include="$(PathToOutput)\**\*.*">
<Excl>%(Excl.Identity)</Excl>
</AllReleaseFiles >
<!-- filter to get list of files we don't want -->
<FilesToExclude Include="@(AllReleaseFiles)"
Condition="$([System.String]::Copy('%(FileName)').Contains('%(Excl)'))"/>
<!-- all but the ones to exclude -->
<ReleaseFiles Include="@(AllReleaseFiles)" Exclude="@(FilesToExclude)"/>
</ItemGroup>
<Message Text="%(ReleaseFiles.Identity)" />
</Target>
使用标准方法从项目组中排除文件文件,方法是使用排除属性并引用另一个项目组。它会更容易理解。
示例:
<PropertyGroup>
<PathToOutput>C:/</PathToOutput>
</PropertyGroup>
<ItemGroup>
<FilesToExclude Include="$(PathToOutput)\**\Newtonsoft.Json" />
<FilesToExclude Include="$(PathToOutput)\**\Reactive" />
<ReleaseFiles Include="$(PathToOutput)\**\*.*" Exclude="@(FilesToExclude)"/>
</ItemGroup>