항목 함수 작업

작업 및 대상의 코드는 프로젝트의 항목에 대한 정보를 얻기 위해 항목 함수를 호출할 수 있습니다(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")) 지정된 메타데이터 이름 및 값을 가진 항목을 반환합니다. 비교 시 대/소문자가 구분되지 않습니다.

참고 항목

ExistsMSBuild 조건(예: 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
  -->

메타데이터 항목 함수를 사용할 때 중복 검색

항목 함수는 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 조건을 참조하세요.

속성을 사용하여 항목 메타데이터에 대한 필터링과 같은 항목 목록에 대한 작업을 수행할 수도 있습니다. 자세한 내용은 항목을 참조하세요.