항목 함수 작업
작업 및 대상의 코드는 항목 함수를 호출하여 프로젝트의 항목에 대한 정보를 가져올 수 있습니다(MSBuild 4.0 이상). 이러한 함수는 고유 항목 가져오기를 간소화하고 항목을 반복하는 것보다 빠릅니다.
문자열 항목 함수
.NET Framework에서 문자열 메서드 및 속성을 사용하여 모든 항목 값에서 작동할 수 있습니다. String 메서드의 경우 메서드 이름을 지정합니다. String 속성의 경우 "get_" 뒤의 속성 이름을 지정합니다.
문자열이 여러 개 있는 항목의 경우 문자열 메서드 또는 속성은 각 문자열에서 실행됩니다.
다음 예제에서는 이러한 문자열 항목 함수를 사용하는 방법을 보여 줍니다.
<ItemGroup>
<theItem Include="andromeda;tadpole;cartwheel" />
</ItemGroup>
<Target Name = "go">
<Message Text="IndexOf @(theItem->IndexOf('r'))" />
<Message Text="Replace @(theItem->Replace('tadpole', 'pinwheel'))" />
<Message Text="Length @(theItem->get_Length())" />
<Message Text="Chars @(theItem->get_Chars(2))" />
</Target>
<!--
Output:
IndexOf 3;-1;2
Replace andromeda;pinwheel;cartwheel
Length 9;7;9
Chars d;d;r
-->
내장 항목 함수
아래 표에서는 항목에 사용할 수 있는 내장 함수를 나열합니다.
기능 | 예시 | 묘사 |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
지정된 상대 경로가 모든 입력 항목에 추가된 새 항목 집합을 반환합니다. |
Count |
@(MyItems->Count()) |
항목의 개수를 반환합니다. |
DirectoryName |
@(MyItems->DirectoryName()) |
각 항목에 해당하는 Path.DirectoryName 반환합니다. |
Distinct |
@(MyItems->Distinct()) |
고유한 Include 값이 있는 항목을 반환합니다. 메타데이터는 무시됩니다. 비교는 대소문자를 구분하지 않습니다. |
DistinctWithCase |
@(MyItems->DistinctWithCase()) |
고유한 itemspec 값이 있는 항목을 반환합니다. 메타데이터는 무시됩니다. 비교는 대/소문자를 구분합니다. |
Exists |
@(MyItems->Exists()) |
항목 집합을 디스크에 실제로 존재하는 항목으로 필터링합니다. |
GetPathsOfAllDirectoriesAbove |
@(MyItems->GetPathsOfAllFilesAbove()) |
항목 집합이 지정되면 모든 상위 디렉터리를 나타내는 항목을 반환합니다. 주문은 보장되지 않습니다. |
Reverse |
@(MyItems->Reverse()) |
항목을 역순으로 반환합니다. |
AnyHaveMetadataValue |
@(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) |
항목에 지정된 메타데이터 이름과 값이 있는지 여부를 나타내는 boolean 반환합니다. 비교는 대/소문자를 구분하지 않습니다. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
메타데이터가 지워진 항목을 반환합니다.
itemspec 만 유지됩니다. |
HasMetadata |
@(MyItems->HasMetadata("MetadataName")) |
지정된 메타데이터 이름을 가진 항목을 반환합니다. 비교는 대/소문자를 구분하지 않습니다. |
Metadata |
@(MyItems->Metadata("MetadataName")) |
메타데이터 이름이 있는 메타데이터의 값을 반환합니다. 반환된 항목에는 원본 값과 동일한 메타데이터가 있습니다. |
WithMetadataValue |
@(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) |
지정된 메타데이터 이름과 값이 있는 항목을 반환합니다. 비교는 대/소문자를 구분하지 않습니다. |
메모
Exists
다른 컨텍스트에서도 사용할 수 있습니다. MSBuild 조건(예: Condition="Exists('path')"
; ) 또는 정적 속성 함수에서(예: $([System.IO.File]::Exists("path"))
).
다음 예제에서는 내장 항목 함수를 사용하는 방법을 보여 줍니다.
<ItemGroup>
<TheItem Include="first">
<Plant>geranium</Plant>
</TheItem>
<TheItem Include="second">
<Plant>algae</Plant>
</TheItem>
<TheItem Include="third">
<Plant>geranium</Plant>
</TheItem>
</ItemGroup>
<Target Name="go">
<Message Text="MetaData: @(TheItem->Metadata('Plant'))" />
<Message Text="HasMetadata: @(theItem->HasMetadata('Plant'))" />
<Message Text="WithMetadataValue: @(TheItem->WithMetadataValue('Plant', 'geranium'))" />
<Message Text=" " />
<Message Text="Count: @(theItem->Count())" />
<Message Text="Reverse: @(theItem->Reverse())" />
</Target>
<!--
Output:
MetaData: geranium;algae;geranium
HasMetadata: first;second;third
WithMetadataValue: first;third
Count: 3
Reverse: third;second;first
-->
String 메서드 호출
시나리오와 일치하는 항목 함수를 사용할 수 없는 경우 new
속성 함수를 사용하여 메타데이터에서 문자열 개체를 만들고 String
메서드를 호출하여 비슷한 효과를 얻을 수 있습니다. 예를 들어 다음 코드는 부분 문자열 검색을 사용하여 대상의 항목 목록을 필터링합니다.
<Project>
<PropertyGroup>
<SearchString>abc</SearchString>
</PropertyGroup>
<ItemGroup>
<UnfilteredList Include="abcdef;abc;def;xyz"></UnfilteredList>
</ItemGroup>
<Target Name="FilterItemList">
<ItemGroup>
<FilteredList Include="@(UnfilteredList)" Condition="$([System.String]::new('%(UnfilteredList.Identity)').Contains($(SearchString)))"></FilteredList>
</ItemGroup>
<Message Text="Result: @(FilteredList)"/>
</Target>
</Project>
메타데이터 항목 함수를 사용할 때 중복 검색
Metadata
항목 함수는 원본 항목의 원래 메타데이터를 유지합니다. 이는 반환된 항목이 중복되는지 여부를 고려할 때 몇 가지 의미가 있습니다. 중복 항목 처리 방법을 제어하려면 KeepDuplicates 특성을 사용할 수 있습니다. 필요 없는 경우 RemoveMetadata추가하여 메타데이터를 제거할 수도 있습니다. 이 경우 중복 항목을 검색할 때 값 자체만 고려됩니다.
<Target Name="MetadataToItem">
<ItemGroup>
<Sample Include="AAA" SomeItems="1;2;3" />
<Sample Include="BBB" SomeItems="3;4;5" />
</ItemGroup>
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" />
</ItemGroup>
<Message Text="AllSomeItems is @(AllSomeItems)" />
</Target>
출력은 다음과 같습니다.
MetadataToItem:
AllSomeItems is 1;2;3;3;4;5
코드를 다음과 같이 변경하면 중복 항목 값이 성공적으로 검색되고 제거됩니다.
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
</ItemGroup>
MSBuild 조건 함수
HasTrailingSlash
함수는 항목 함수가 아닙니다.
Condition
특성과 함께 사용할 수 있습니다.
MSBuild 조건참조하세요.
관련 콘텐츠
특성을 사용하여 항목 메타데이터 필터링과 같은 항목 목록에 대한 작업을 수행할 수도 있습니다. 자세한 내용은 항목참조하세요.