gpt4 book ai didi

MSBuild:星号和奇怪的 ItemGroup 排除行为

转载 作者:行者123 更新时间:2023-12-02 02:35:41 27 4
gpt4 key购买 nike

我有一个脚本试图从特定目录中的所有文件构建一个 ItemGroup,同时排除具有特定名称的文件(无论扩展名如何)。

要排除的文件列表最初包含文件扩展名,我正在使用社区任务的 RegexReplace 将扩展名替换为星号。然后,我在项目的 Exclude 属性中使用此列表。由于某些原因,文件没有被正确排除,即使列表看起来是正确的。

为了尝试找出原因,我创建了一个测试脚本(如下),它有两个任务:第一个任务以两种不同的方式使用文件模式列表初始化两个属性。第二个任务打印属性和在 Exclude 属性中使用这两个属性所产生的文件。

属性的值似乎相同,但生成的组不同。这怎么可能?

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="Init;Test" ToolsVersion="3.5">
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

<Target Name="Init">
<ItemGroup>
<OriginalFilenames Include="TestDir\SampleProj.exe"/>
<OriginalFilenames Include="TestDir\SampleLib1.dll"/>
</ItemGroup>
<RegexReplace Input="@(OriginalFilenames)" Expression="\.\w+$" Replacement=".*">
<Output TaskParameter="Output" ItemName="PatternedFilenames"/>
</RegexReplace>
<PropertyGroup>
<ExcludeFilesA>TestDir\SampleProj.*;TestDir\SampleLib1.*</ExcludeFilesA>
<ExcludeFilesB>@(PatternedFilenames)</ExcludeFilesB>
</PropertyGroup>
</Target>

<Target Name="Test">
<Message Text='ExcludeFilesA: $(ExcludeFilesA)' />
<Message Text='ExcludeFilesB: $(ExcludeFilesB)' />
<ItemGroup>
<AllFiles Include="TestDir\**"/>
<RemainingFilesA Include="TestDir\**" Exclude="$(ExcludeFilesA)"/>
<RemainingFilesB Include="TestDir\**" Exclude="$(ExcludeFilesB)"/>
</ItemGroup>
<Message Text="&#xA;**AllFiles**&#xA;@(AllFiles, '&#xA;')" />
<Message Text="&#xA;**PatternedFilenames**&#xA;@(PatternedFilenames, '&#xA;')" />
<Message Text="&#xA;**RemainingFilesA**&#xA;@(RemainingFilesA, '&#xA;')" />
<Message Text="&#xA;**RemainingFilesB**&#xA;@(RemainingFilesB, '&#xA;')" />
</Target>

</Project>

输出(为清楚起见重新格式化):

ExcludeFilesA: TestDir\SampleProj.*;TestDir\SampleLib1.*
ExcludeFilesB: TestDir\SampleProj.*;TestDir\SampleLib1.*

AllFiles:
TestDir\SampleLib1.dll
TestDir\SampleLib1.pdb
TestDir\SampleLib2.dll
TestDir\SampleLib2.pdb
TestDir\SampleProj.exe
TestDir\SampleProj.pdb

PatternedFilenames:
TestDir\SampleProj.*
TestDir\SampleLib1.*

RemainingFilesA:
TestDir\SampleLib2.dll
TestDir\SampleLib2.pdb

RemainingFilesB:
TestDir\SampleLib1.dll
TestDir\SampleLib1.pdb
TestDir\SampleLib2.dll
TestDir\SampleLib2.pdb
TestDir\SampleProj.exe
TestDir\SampleProj.pdb

观察到 ExcludeFilesAExcludeFilesB 看起来相同,但生成的组 RemainingFilesARemainingFilesB 不同。

最终,我想使用与生成 ExcludeFilesB 相同的方式生成的模式来获取列表 RemainingFilesA。您能建议一种方法吗,还是我必须完全重新考虑我的方法?

最佳答案

当自定义任务抛出异常时,意外揭示了真正的原因。

ExcludeFilesA 的实际值是 TestDir\SampleProj.*;TestDir\SampleLib1.* 就像人们可能期望的那样。但是 ExcludeFilesB 的实际值为 TestDir\SampleProj.%2a;TestDir\SampleLib1.%2a

据推测,Message 在使用字符串之前会对其进行转义,但 IncludeExclude 不会。这可以解释为什么字符串看起来相同但行为不同。

顺便说一下,执行顺序似乎与此没有任何关系,而且我非常确定(经过大量实验)所有内容都按照其在该脚本中出现的顺序执行和评估。

关于MSBuild:星号和奇怪的 ItemGroup 排除行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1931458/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com