다음을 통해 공유


속성 및 항목 비교

MSBuild 속성과 항목은 모두 작업에 정보를 전달하고 조건을 확인하며 프로젝트 파일 전체에서 참조할 수 있는 값을 저장하는 데 사용됩니다.

  • 속성은 이름-값 쌍입니다.자세한 내용은 MSBuild 속성을 참조하십시오.

  • 항목은 일반적으로 파일을 나타내는 개체입니다.항목 개체에는 연결된 메타데이터 컬렉션이 있을 수 있습니다.메타데이터는 이름-값 쌍입니다.자세한 내용은 MSBuild 항목을 참조하십시오.

스칼라 및 벡터

MSBuild 속성은 문자열 값이 하나만 있는 이름-값 쌍이므로 스칼라로 설명되는 경우가 많고MSBuild 항목 형식은 항목 목록이므로 벡터로 설명되는 경우가 많습니다.그러나 실제로는 속성이 다중 값을 나타낼 수 있으며 항목 형식에 0개의 항목이나 1개의 항목이 있을 수 있습니다.

Dd997067.collapse_all(ko-kr,VS.110).gif대상 종속성 삽입

속성이 어떻게 다중 값을 나타낼 수 있는지 확인하기 위해 빌드할 대상 목록에 대상을 추가하는 일반적인 사용 패턴을 살펴보겠습니다.이 목록은 보통 하나의 속성 값으로 나타나며 대상 이름은 세미콜론으로 구분됩니다.

<PropertyGroup>
    <BuildDependsOn>
        BeforeBuild;
        CoreBuild;
        AfterBuild
    </BuildDependsOn>
</PropertyGroup>

BuildDependsOn 속성은 일반적으로 대상 DependsOnTargets 특성의 인수로 사용되어 사실상 이 특성을 항목 목록으로 변환합니다.이 속성을 재정의하여 대상을 추가하거나 대상 실행 순서를 변경할 수 있습니다.다음 예제를 참조하십시오.

<PropertyGroup>
    <BuildDependsOn>
        $(BuildDependsOn);
        CustomBuild;
    </BuildDependsOn>
</PropertyGroup>

위 예제에서는 대상 목록에 CustomBuild 대상을 추가하고 BuildDependsOn에 값 BeforeBuild;CoreBuild;AfterBuild;CustomBuild를 지정합니다.

MSBuild 4.0부터 대상 종속성 삽입은 사용되지 않습니다.대신 AfterTargets 특성과 BeforeTargets 특성을 사용합니다.자세한 내용은 대상 빌드 순서를 참조하십시오.

Dd997067.collapse_all(ko-kr,VS.110).gif문자열과 항목 목록 사이의 변환

MSBuild는 필요에 따라 항목 형식과 문자열 값 사이를 변환합니다.항목 목록이 어떻게 문자열 값이 될 수 있는지 확인하기 위해 항목 형식을 MSBuild 속성의 값으로 사용하면 어떻게 되는지 살펴보겠습니다.

<ItemGroup>
    <OutputDir Include="KeyFiles\;Certificates\" />
  </ItemGroup>
<PropertyGroup>
    <OutputDirList>@(OutputDir)</OutputDirList>
</PropertyGroup>

항목 형식 OutputDir에 값이 "KeyFiles\;Certificates\"인 Include 특성이 있습니다.MSBuild는 이 문자열을 KeyFiles\ 및 Certificates\라는 두 항목으로 구문 분석합니다.항목 형식 OutputDir을 OutputDirList 속성의 값으로 사용하면 MSBuild는 해당 항목 형식을 세미콜론으로 구분한 문자열 "KeyFiles\;Certificates\"로 변환하거나 "평면화"합니다.

작업의 속성 및 항목

속성 및 항목은 MSBuild 작업에 대한 입력 및 출력으로 사용됩니다.자세한 내용은 MSBuild 작업을 참조하십시오.

속성은 특성으로 작업에 전달됩니다.작업 내에서 MSBuild 속성은 값이 문자열로 변환되거나 문자열이 값으로 변환될 수 있는 속성 형식으로 나타납니다.지원되는 속성 형식은 bool, char, DateTime, Decimal, Double, int, stringChangeType이 처리할 수 있는 모든 형식입니다.

항목은 ITaskItem 개체로 작업에 전달됩니다.작업 내에서 ItemSpec은 항목의 값을 나타내며 GetMetadata는 해당 메타데이터를 검색합니다.

항목 형식의 항목 목록은 ITaskItem 개체의 배열로 전달할 수 있습니다..NET Framework 3.5부터 Remove 특성을 사용하여 대상의 항목 목록에서 항목을 제거할 수 있습니다.항목 목록에서 항목을 제거할 수 있으므로 항목 형식에 0개의 항목이 있을 수 있습니다.항목 목록을 작업에 전달할 경우 작업의 코드를 통해 이러한 가능성을 확인해야 합니다.

속성 및 항목 평가 순서

빌드의 평가 단계 중에는 가져온 파일이 표시 순서대로 빌드에 통합됩니다.속성 및 항목은 다음과 같은 순서에 따라 세 가지 전달 작업을 통해 정의됩니다.

  • 속성이 표시 순서대로 정의 및 수정됩니다.

  • 항목 정의가 표시 순서대로 정의 및 수정됩니다.

  • 항목이 표시 순서대로 정의 및 수정됩니다.

빌드의 실행 단계 중에는 대상 내에 정의된 속성 및 항목이 표시 순서대로 단일 단계에서 함께 평가됩니다.

그러나 이것이 다는 아닙니다.속성, 항목 정의 또는 항목이 정의되면 해당 값이 평가됩니다.식 계산기는 값을 지정하는 문자열을 확장합니다.문자열 확장 작업은 빌드 단계에 종속됩니다.보다 자세한 속성 및 항목 평가 순서는 다음과 같습니다.

  • 빌드의 평가 단계 중:

    • 속성이 표시 순서대로 정의 및 수정됩니다.속성 함수가 실행됩니다.식 내에서 $(PropertyName) 형식의 속성 값이 확장됩니다.속성 값이 확장된 식으로 설정됩니다.

    • 항목 정의가 표시 순서대로 정의 및 수정됩니다.식 내에서 속성 함수가 이미 확장되어 있습니다.메타데이터 값이 확장된 식으로 설정됩니다.

    • 항목 형식이 표시 순서대로 정의 및 수정됩니다.@(ItemType) 형식의 항목 값이 확장됩니다.항목 변환도 확장됩니다.식 내에서 속성 함수 및 값이 이미 확장되어 있습니다.항목 목록 및 메타데이터 값이 확장된 식으로 설정됩니다.

  • 빌드의 실행 단계 중:

    • 대상 내에 정의된 속성 및 항목이 표시 순서대로 함께 평가됩니다.속성 함수가 실행되고 식 내에서 속성 값이 확장됩니다.항목 값 및 항목 변환도 확장됩니다.속성 값, 항목 형식 값 및 메타데이터 값이 확장된 식으로 설정됩니다.

Dd997067.collapse_all(ko-kr,VS.110).gif평가 순서의 미묘한 효과

빌드의 평가 단계에서 속성 평가 작업은 항목 평가 작업에 선행합니다.그렇지만 속성에는 항목 값에 종속된 것처럼 보이는 값이 있을 수 있습니다.다음 스크립트를 살펴보십시오.

<ItemGroup>
    <KeyFile Include="KeyFile.cs">
        <Version>1.0.0.3</Version>
    </KeyFile>
</ItemGroup>
<PropertyGroup>
    <KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
</PropertyGroup>
<Target Name="AfterBuild">
    <Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>

Message 작업을 실행하면 다음 메시지가 표시됩니다.

KeyFileVersion: 1.0.0.3

이는 KeyFileVersion의 값이 실제로는 문자열 "@(KeyFile->'%(Version)')"이기 때문입니다.속성을 처음에 정의할 때 항목 및 항목 변환이 확장되지 않았으므로 KeyFileVersion 속성에 확장되지 않은 문자열의 값이 할당되었습니다.

빌드의 실행 단계 중 MSBuild는 Message 작업을 처리할 때 문자열 "@(KeyFile->'%(Version)')"을 확장하여 "1.0.0.3"을 생성합니다.

속성 및 항목 그룹의 순서를 반대로 바꾸어도 같은 메시지가 나타나는 것을 볼 수 있습니다.

다음 두 번째 예제에서는 속성 및 항목 그룹이 대상 내에 있는 경우 어떻게 되는지 살펴보겠습니다.

<Target Name="AfterBuild">
    <PropertyGroup>
        <KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
    </PropertyGroup>
    <ItemGroup>
        <KeyFile Include="KeyFile.cs">
            <Version>1.0.0.3</Version>
        </KeyFile>
    </ItemGroup>
    <Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>

Message 작업을 실행하면 다음 메시지가 표시됩니다.

KeyFileVersion: 

이는 빌드의 실행 단계 중 대상 내에 정의된 속성 및 항목 그룹이 위에서 아래 순서로 동시에 평가되었기 때문입니다.KeyFileVersion을 정의하면 KeyFile을 알 수 없습니다.따라서 항목 변환이 빈 문자열로 확장됩니다.

이 경우 속성 및 항목 그룹의 순서를 반대로 바꾸면 원래 메시지가 복원됩니다.

<Target Name="AfterBuild">
    <ItemGroup>
        <KeyFile Include="KeyFile.cs">
            <Version>1.0.0.3</Version>
        </KeyFile>
    </ItemGroup>
    <PropertyGroup>
        <KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
    </PropertyGroup>
    <Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>

KeyFileVersion의 값이 "@(KeyFile->'%(Version)')"이 아니라 "1.0.0.3"으로 설정되었습니다.Message 작업을 실행하면 다음 메시지가 표시됩니다.

KeyFileVersion: 1.0.0.3

참고 항목

기타 리소스

MSBuild 고급 개념