속성 및 항목 비교Comparing Properties and Items

MSBuild 속성 및 항목은 둘 다 작업에 정보를 전달하고, 조건을 확인한 다음 프로젝트 파일 전체에서 참조할 수 있는 값을 저장하는 데 사용됩니다.MSBuild properties and items are both used to pass information to tasks, evaluate conditions, and store values that can be referenced throughout the project file.

  • 속성은 이름-값 쌍입니다.Properties are name-value pairs. 자세한 내용은 MSBuild 속성을 참조하세요.For more information, see MSBuild Properties.

  • 항목은 일반적으로 파일을 나타내는 개체입니다.Items are objects that typically represent files. 항목 개체에는 연결된 메타데이터 컬렉션이 있을 수 있습니다.Item objects can have associated metadata collections. 메타데이터는 이름-값 쌍입니다.Metadata are name-value pairs. 자세한 내용은 항목을 참조하세요.For more information, see Items.

스칼라 및 벡터Scalars and Vectors

MSBuild 속성은 문자열 값이 하나만 있는 이름-값 쌍이므로 보통 스칼라로 설명됩니다.Because MSBuild properties are name-value pairs that have just one string value, they are often described as scalar. MSBuild 항목 종류는 항목의 목록이므로 보통 벡터로 설명됩니다.Because MSBuild item types are lists of items, they are often described as vector. 그러나 실제로 속성이 여러 값을 나타낼 수 있으며 항목 종류에는 0개 또는 1개의 항목이 있을 수 있습니다.However, in practice, properties can represent multiple values, and item types can have zero or one items.

대상 종속성 주입Target Dependency Injection

속성에서 여러 값을 나타낼 수 있는 방법을 알아보려면 빌드할 대상의 목록에 대상을 추가하기 위한 일반적인 사용 패턴을 고려해 보세요.To see how properties can represent multiple values, consider a common usage pattern for adding a target to a list of targets to be built. 이 목록은 일반적으로 대상 이름이 세미콜론으로 구분된 속성 값으로 표시됩니다.This list is typically represented by a property value, with the target names separated by semicolons.

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

BuildDependsOn 속성은 일반적으로 대상 DependsOnTargets 특성의 인수로 사용되며, 해당 특성을 효과적으로 항목 목록으로 변환합니다.The BuildDependsOn property is typically used as the argument of a target DependsOnTargets attribute, effectively converting it to an item list. 대상을 추가하거나 대상 실행 순서를 변경하기 위해 이 속성을 재정의할 수 있습니다.This property can be overridden to add a target or to change the target execution order. 예를 들면 다음과 같습니다.For example,

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

위의 코드는 대상 목록에 CustomBuild 대상을 추가하면서 BuildDependsOnBeforeBuild;CoreBuild;AfterBuild;CustomBuild 값을 제공합니다.adds the CustomBuild target to the target list, giving BuildDependsOn the value BeforeBuild;CoreBuild;AfterBuild;CustomBuild.

MSBuild 4.0부터는 대상 종속성 주입이 더 이상 사용되지 않습니다.Starting with MSBuild 4.0, target dependency injection is deprecated. 대신 AfterTargetsBeforeTargets 특성을 사용하세요.Use the AfterTargets and BeforeTargets attributes instead. 자세한 내용은 대상 빌드 순서를 참조하세요.For more information, see Target Build Order.

문자열과 항목 목록 간의 변환Conversions between Strings and Item Lists

MSBuild는 필요에 따라 항목 종류 및 문자열 값 간의 변환을 수행합니다.MSBuild performs conversions to and from item types and string values as needed. 항목 목록이 문자열 값이 되는 방법을 알아보려면 항목 종류가 MSBuild 속성의 값으로 사용되는 경우 발생하는 상황을 고려해야 합니다.To see how an item list can become a string value, consider what happens when an item type is used as the value of an MSBuild property:

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

OutputDir 항목 종류에는 "KeyFiles\;Certificates\" 값을 가진 Include 특성이 있습니다.The item type OutputDir has an Include attribute with the value "KeyFiles\;Certificates\". MSBuild는 이 문자열을 두 개의 항목인 KeyFiles\ 및 Certificates\로 구문 분석합니다.MSBuild parses this string into two items: KeyFiles\ and Certificates\. OutputDir 항목 종류가 OutputDirList 속성의 값으로 사용되면 MSBuild에서 항목 종류를 세미콜론으로 구분된 문자열 "KeyFiles\;Certificates\"로 변환하거나 “평면화"합니다.When the item type OutputDir is used as the value of the OutputDirList property, MSBuild converts or "flattens" the item type into to the semicolon-separated string "KeyFiles\;Certificates\".

작업의 속성 및 항목Properties and Items in Tasks

속성 및 항목은 MSBuild 작업의 입력 및 출력으로 사용됩니다.Properties and items are used as inputs and outputs to MSBuild tasks. 자세한 내용은 작업을 참조하세요.For more information, see Tasks.

속성은 특성으로 작업에 전달됩니다.Properties are passed to tasks as attributes. 작업 내에서 MSBuild 속성은 값이 문자열 간에 변환될 수 있는 속성 형식으로 표시됩니다.Within the task, an MSBuild property is represented by a property type whose value can be converted to and from a string. 지원되는 속성 형식에는 bool, char, DateTime, Decimal, Double, int, stringChangeType에서 처리할 수 있는 모든 형식이 포함되어 있습니다.The supported property types include bool, char, DateTime, Decimal, Double, int, string, and any type that ChangeType can handle.

항목은 ITaskItem 개체로 작업에 전달됩니다.Items are passed to tasks as ITaskItem objects. 작업 내에서 ItemSpec는 항목의 값을 나타내며 GetMetadata는 해당 메타데이터를 검색합니다.Within the task, ItemSpec represents the value of the item and GetMetadata retrieves its metadata.

항목 종류의 항목 목록은 ITaskItem 개체의 배열로 전달될 수 있습니다.The item list of an item type can be passed as an array of ITaskItem objects. .NET Framework 3.5부터는 Remove 특성을 사용하여 항목 목록에서 항목을 제거할 수 없습니다.Beginning with the .NET Framework 3.5, items can be removed from an item list in a target by using the Remove attribute. 항목 목록에서 항목을 제거할 수 있으므로, 항목 종류의 항목이 0개일 수도 있습니다.Because items can be removed from an item list, it is possible for an item type to have zero items. 항목 목록이 작업에 전달되면 작업의 코드에서 이러한 가능성을 확인해야 합니다.If an item list is passed to a task, the code in the task should check for this possibility.

속성 및 항목 평가 순서Property and Item Evaluation Order

빌드의 평가 단계 중 가져온 파일은 표시되는 순서대로 빌드에 통합됩니다.During the evaluation phase of a build, imported files are incorporated into the build in the order in which they appear. 속성 및 항목이 다음과 같은 순서로 세 단계로 정의됩니다.Properties and items are defined in three passes in the following order:

  • 속성이 표시되는 순서대로 정의되고 수정됩니다.Properties are defined and modified in the order in which they appear.

  • 항목 정의가 표시되는 순서대로 정의되고 수정됩니다.Item definitions are defined and modified in the order in which they appear.

  • 항목이 표시되는 순서대로 정의되고 수정됩니다.Items are defined and modified in the order in which they appear.

    빌드 실행 단계 중 대상 내에 정의된 속성 및 항목은 표시되는 순서대로 단일 단계에서 함께 평가됩니다.During the execution phase of a build, properties and items that are defined within targets are evaluated together in a single phase in the order in which they appear.

    그러나 이것이 다는 아닙니다.However, this is not the full story. 속성, 항목 정의 또는 항목이 정의될 때 값이 계산됩니다.When a property, item definition, or item is defined, its value is evaluated. 식 계산기가 값을 지정하는 문자열을 확장합니다.The expression evaluator expands the string that specifies the value. 문자열 확장은 빌드 단계에 따라 달라집니다.The string expansion is dependent on the build phase. 더 자세한 속성 및 항목 평가 순서는 다음과 같습니다.Here is a more detailed property and item evaluation order:

  • 빌드의 평가 단계 중:During the evaluation phase of a build:

    • 속성이 표시되는 순서대로 정의되고 수정됩니다.Properties are defined and modified in the order in which they appear. 속성 함수가 실행됩니다.Property functions are executed. $(PropertyName) 양식의 속성 값이 식 내에서 확장됩니다.Property values in the form $(PropertyName) are expanded within expressions. 속성 값이 확장된 식으로 설정됩니다.The property value is set to the expanded expression.

    • 항목 정의가 표시되는 순서대로 정의되고 수정됩니다.Item definitions are defined and modified in the order in which they appear. 속성 함수는 식 내에서 이미 확장되었습니다.Property functions have already been expanded within expressions. 메타데이터 값은 확장된 식으로 설정됩니다.Metadata values are set to the expanded expressions.

    • 항목 종류가 표시되는 순서대로 정의되고 수정됩니다.Item types are defined and modified in the order in which they appear. @(ItemType) 양식의 항목 값이 확장됩니다.Item values in the form @(ItemType) are expanded. 항목 변환도 확장됩니다.Item transformations are also expanded. 속성 함수 및 값은 식 내에서 이미 확장되었습니다.Property functions and values have already been expanded within expressions. 항목 목록 및 메타데이터 값은 확장된 식으로 설정됩니다.The item list and metadata values are set to the expanded expressions.

  • 빌드의 실행 단계 중:During the execution phase of a build:

    • 대상 내에 정의된 속성 및 항목이 표시되는 순서대로 함께 평가됩니다.Properties and items that are defined within targets are evaluated together in the order in which they appear. 속성 함수가 실행되며, 속성 값이 식 내에서 확장됩니다.Property functions are executed and property values are expanded within expressions. 항목 값 및 항목 변환도 확장됩니다.Item values and item transformations are also expanded. 속성 값, 항목 종류 값 및 메타데이터 값은 확장된 식으로 설정됩니다.The property values, item type values, and metadata values are set to the expanded expressions.

평가 순서의 미묘한 효과Subtle Effects of the Evaluation Order

빌드의 평가 단계에서 속성 확인이 항목 확인 앞에 옵니다.In the evaluation phase of a build, property evaluation precedes item evaluation. 그럼에도 불구하고 속성은 항목 값에 따라 다르게 표시되는 값을 가질 수 있습니다.Nevertheless, properties can have values that appear to depend on item values. 다음 스크립트를 살펴보세요.Consider the following script.

<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>  

메시지 작업 실행에서 다음 메시지를 표시합니다.Executing the Message task displays this message:

KeyFileVersion: 1.0.0.3  

KeyFileVersion의 값은 실제로 "@(KeyFile->'%(Version)')" 문자열이기 때문입니다.This is because the value of KeyFileVersion is actually the string "@(KeyFile->'%(Version)')". 속성을 처음에 정의할 때 항목 및 항목 변환이 확장되지 않으므로 KeyFileVersion 속성에는 확장되지 않은 문자열의 값이 할당되었습니다.Item and item transformations were not expanded when the property was first defined, so the KeyFileVersion property was assigned the value of the unexpanded string.

빌드의 실행 단계 중 메시지 작업을 처리할 때 MSBuild에서 "@(KeyFile->'%(Version)')" 문자열을 확장하여 "1.0.0.3"을 생성합니다.During the execution phase of the build, when it processes the Message task, MSBuild expands the string "@(KeyFile->'%(Version)')" to yield "1.0.0.3".

속성 및 항목 그룹의 순서가 반대로 된 경우에도 동일한 오류 메시지가 표시됩니다.Notice that the same message would appear even if the property and item groups were reversed in order.

두 번째 예제로, 속성 및 항목 그룹이 대상 내에 있는 경우 발생할 수 있는 상황을 고려해 보세요.As a second example, consider what can happen when property and item groups are located within targets:

<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>  

메시지 작업에서 다음 메시지를 표시합니다.The Message task displays this message:

KeyFileVersion:   

빌드의 실행 단계 중 대상 내에 정의된 속성 및 항목 그룹이 위에서 아래로 동시에 평가되기 때문입니다.This is because during the execution phase of the build, property and item groups defined within targets are evaluated top to bottom at the same time. KeyFileVersion이 정의될 때 KeyFile은 알려져 있지 않습니다.When KeyFileVersion is defined, KeyFile is unknown. 따라서 항목 변환은 빈 문자열로 확장됩니다.Therefore, the item transformation expands to an empty string.

이 경우에 속성 및 항목 그룹의 순서를 반대로 해도 원본 메시지가 그대로 표시됩니다.In this case, reversing the order of the property and item groups restores the original message:

<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"으로 설정됩니다.The value of KeyFileVersion is set to "1.0.0.3" and not to "@(KeyFile->'%(Version)')". 메시지 작업에서 다음 메시지를 표시합니다.The Message task displays this message:

KeyFileVersion: 1.0.0.3  

참고 항목See Also

고급 개념Advanced Concepts