다음을 통해 공유


항목 함수 작업

작업 및 대상의 코드는 항목 함수를 호출하여 프로젝트의 항목에 대한 정보를 가져올 수 있습니다(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 조건참조하세요.

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