ItemGroup
特定の名前のファイルを除外しながら(拡張子に関係なく)、特定のディレクトリ内のすべてのファイルから構築しようとするスクリプトがあります。
除外するファイルのリストには、最初はファイル拡張子が含まれています。私はCommunity Tasksを使用RegexReplace
して、拡張子をアスタリスクに置き換えています。次に、このリストをアイテムのExclude
属性で使用します。リストが正しいように見えても、何らかの理由でファイルが適切に除外されません。
原因を見つけるために、2つのタスクを持つテストスクリプト(以下)を作成しました。最初のスクリプトは、2つの異なる方法でファイルパターンのリストを使用して2つのプロパティを初期化します。2番目のタスクは、属性でこれらのプロパティの両方を使用した結果のプロパティとファイルの両方を出力し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="
**AllFiles**
@(AllFiles, '
')" />
<Message Text="
**PatternedFilenames**
@(PatternedFilenames, '
')" />
<Message Text="
**RemainingFilesA**
@(RemainingFilesA, '
')" />
<Message Text="
**RemainingFilesB**
@(RemainingFilesB, '
')" />
</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
両方ExcludeFilesA
を観察し、ExcludeFilesB
同じように見えますが、結果のグループはRemainingFilesA
異なりRemainingFilesB
ます。
RemainingFilesA
最終的には、同じ方法で生成されたパターンを使用してリストを取得したいと思いExcludeFilesB
ます。方法を提案できますか、それとも私のアプローチを完全に再考する必要がありますか?