MSBuild 속성

빌드를 구성하는 데 사용될 수 있는 이름/값 쌍인 속성은 작업에 값을 전달하고, 조건을 평가하고, 프로젝트 파일 전체에서 참조할 값을 저장하는 데 유용합니다.

프로젝트 파일에서 속성 정의 및 참조

속성 이름을 포함하는 요소를 PropertyGroup 요소의 자식으로 만들어 속성을 선언합니다. 예를 들어 다음 XML은 값이 BuildBuildDir 속성을 만듭니다.

<PropertyGroup>
    <BuildDir>Build</BuildDir>
</PropertyGroup>

유효한 속성 이름은 대문자 또는 소문자 또는 밑줄(_)로 시작합니다. 유효한 후속 문자에는 영숫자 문자(문자 또는 숫자), 밑줄, 하이픈(-)이 포함됩니다.

프로젝트 파일 전체에서 $(<PropertyName>) 구문을 사용하여 속성을 참조합니다. 예를 들어 이전 예제의 속성은 $(BuildDir)을 사용하여 참조합니다.

속성을 다시 정의하여 속성값을 변경할 수 있습니다. 다음 XML을 사용하면 BuildDir 속성에 새 값을 제공할 수 있습니다.

<PropertyGroup>
    <BuildDir>Alternate</BuildDir>
</PropertyGroup>

속성은 프로젝트 파일에 표시되는 순서대로 평가됩니다. 이전 값을 할당한 후에 BuildDir의 새 값을 선언해야 합니다.

예약된 속성

MSBuild는 몇 개의 속성 이름을 예약하여 프로젝트 파일과 MSBuild 이진 파일에 대한 정보를 저장합니다. 이러한 속성은 다른 속성과 마찬가지로 $ 표기법을 사용하여 참조됩니다. 예를 들어 $(MSBuildProjectFile)은 파일 확장명을 포함한 프로젝트 파일의 전체 파일 이름을 반환합니다.

자세한 내용은 방법: 프로젝트 파일의 이름 또는 위치 참조MSBuild의 예약된 속성 및 잘 알려진 속성을 참조하세요.

MSBuild 내부 속성

밑줄(_)로 시작하는 표준 가져오기 파일에 정의된 속성은 MSBuild에 비공개이며 사용자 코드에서 읽거나 다시 설정하거나 재정의해서는 안 됩니다.

환경 속성

예약된 속성을 참조하는 것과 같이 프로젝트 파일에서 환경 변수를 참조할 수 있습니다. 예를 들어 프로젝트 파일에서 PATH 환경 변수를 사용하려면 $(Path)를 사용합니다. 프로젝트에 환경 속성과 이름이 같은 속성 정의가 포함되어 있으면 프로젝트의 속성이 환경 변수의 값을 재정의합니다.

각 MSBuild 프로젝트에는 격리된 환경 블록을 가지고 있습니다. 오직 읽거나 자체 블록에 기록만 합니다. MSBuild는 프로젝트 파일을 평가하거나 빌드하기 전에 속성 컬렉션을 초기화하는 경우에만 환경 변수를 읽습니다. 그 후 환경 속성은 고정됩니다. 즉, 각 생성된 도구가 같은 이름과 값으로 시작합니다.

생성된 도구 내에서 환경 변수의 현재 값을 가져오려면 속성 함수 System.Environment.GetEnvironmentVariable을 사용합니다. 그러나 작업 매개 변수 EnvironmentVariables를 사용하는 메서드가 좋습니다. 이 문자열 배열에 설정된 환경 속성은 시스템 환경 변수에 영향을 주지 않고 생성된 도구에 전달할 수 있습니다.

모든 환경 변수가 읽어들여져 초기 속성이 되는 것은 아닙니다. "386"와 같은 유효한 MSBuild 속성 이름이 아닌 모든 환경 변수는 무시됩니다.

자세한 내용은 방법: 빌드 시 환경 변수 사용을 참조하세요.

레지스트리 속성

다음 구문을 사용하여 시스템 레지스트리 값을 읽을 수 있습니다. 여기서 HiveHKEY_LOCAL_MACHINE과 같은 레지스트리 하이브, MyKey는 키 이름, MySubKey는 하위 키 이름, Value는 하위 키의 값입니다.

$(registry:Hive\MyKey\MySubKey@Value)

기본 하위 키 값을 가져오려면 Value를 생략합니다.

$(registry:Hive\MyKey\MySubKey)

이 레지스트리 값을 사용하여 빌드 속성을 초기화할 수 있습니다. 예를 들어 Visual Studio 웹 브라우저 홈 페이지를 나타내는 빌드 속성을 만들려면 다음 코드를 사용합니다.

<PropertyGroup>
  <VisualStudioWebBrowserHomePage>
    $(registry:HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\WebBrowser@HomePage)
  </VisualStudioWebBrowserHomePage>
<PropertyGroup>

Warning

.NET SDK 버전의 MSBuild(dotnet build)에서는 레지스트리 속성이 지원되지 않습니다.

실행 중에 속성 만들기

Target 요소 외부에 배치되는 속성의 경우 빌드의 평가 단계에서 값이 할당됩니다. 후속 실행 단계 중에 다음과 같이 속성을 만들거나 수정할 수 있습니다.

  • 모든 작업에서 속성을 내보낼 수 있습니다. 속성을 내보내려면 Task 요소에 PropertyName 특성이 포함된 자식 Output 요소가 있어야 합니다.

  • CreateProperty 작업에서 속성을 내보낼 수 있습니다. 이러한 사용법은 더 이상 사용되지 않습니다.

  • Target 요소는 속성 선언이 들어 있을 수 있는 PropertyGroup 요소를 포함할 수 있습니다.

전역 속성

MSBuild는 -property 또는 -p 스위치를 사용하여 명령줄에서 속성을 설정할 수 있습니다. 이러한 전역 속성값은 프로젝트 파일에서 설정되는 속성값을 재정의합니다. 여기에는 환경 속성이 포함되지만 변경할 수 없는 예약된 속성은 포함되지 않습니다.

다음 예제에서는 전역 Configuration 속성을 DEBUG로 설정합니다.

msbuild.exe MyProj.proj -p:Configuration=DEBUG

MSBuild 작업의 Properties 특성을 사용하여 다중 프로젝트 빌드의 자식 프로젝트에 대해 전역 속성을 설정하거나 수정할 수도 있습니다. MSBuild 작업의 RemoveProperties 특성을 사용하여 전달하지 않을 속성 목록을 지정하지 않을 경우 전역 속성도 자식 프로젝트로 전달됩니다. 자세한 내용은 MSBuild 작업을 참조하세요.

지역 속성

프로젝트에서 로컬 속성을 다시 설정할 수 있습니다. 전역 속성은 사용할 수 없습니다. 옵션과 함께 -p 명령줄에서 로컬 속성을 설정하면 프로젝트 파일의 설정이 명령줄보다 우선합니다.

프로젝트 태그의 특성을 사용하여 TreatAsLocalProperty 로컬 속성을 지정합니다.

다음 코드는 두 속성이 로컬임을 지정합니다.

<Project Sdk="Microsoft.Net.Sdk" TreatAsLocalProperty="Prop1;Prop2">

로컬 속성은 다중 프로젝트 빌드의 자식 프로젝트에 전달되지 않습니다. 명령줄에서 옵션과 함께 -p 값을 제공하는 경우 자식 프로젝트에는 부모 프로젝트에서 변경된 로컬 값 대신 전역 속성 값이 제공되지만 자식 프로젝트(또는 해당 가져오기)도 자체 TreatAsLocalProperty적으로 변경할 수 있습니다.

로컬 속성이 있는 예제

다음 코드 예제에서는 다음과 같은 효과를 보여 줍니다. TreatAsLocalProperty

<!-- test1.proj -->
<Project TreatAsLocalProperty="TreatedAsLocalProp">
    <PropertyGroup>
        <TreatedAsLocalProp>LocalOverrideValue</TreatedAsLocalProp>
    </PropertyGroup>

    <Target Name="Go">
        <MSBuild Projects="$(MSBuildThisFileDirectory)\test2.proj" Targets="Go2" Properties="Inner=true" />
    </Target>

    <Target Name="Go2" BeforeTargets="Go">
        <Warning Text="TreatedAsLocalProp($(MSBuildThisFileName)): $(TreatedAsLocalProp)" />
    </Target>
</Project>
<!-- test2.proj -->
<Project TreatAsLocalProperty="TreatedAsLocalProp">
    <Target Name="Go2">
        <Warning Text="TreatedAsLocalProp($(MSBuildThisFileName)): $(TreatedAsLocalProp)" />
    </Target>
</Project>

test1.proj 명령줄을 빌드하고 전역 값을 GlobalOverrideValue지정 TreatedAsLocalProperty 한다고 가정합니다.

dotnet msbuild .\test1.proj -p:TreatedAsLocalProp=GlobalOverrideValue

출력은 다음과 같습니다.

test1.proj(11,9): warning : TreatedAsLocalProp(test): LocalOverrideValue
test2.proj(3,9): warning : TreatedAsLocalProp(test2): GlobalOverrideValue

자식 프로젝트는 전역 값을 상속하지만 부모 프로젝트는 로컬로 설정된 속성을 사용합니다.

로컬 속성 및 가져오기

가져온 프로젝트에서 특성을 사용하는 경우 TreatAsLocalProperty 속성이 가져오는 값을 고려할 때 순서가 중요합니다.

다음 코드 예제에서는 가져온 프로젝트에 대한 TreatAsLocalProperty 의 효과를 보여 줍니다.

<!-- importer.proj -->
<Project>
    <PropertyGroup>
        <TreatedAsLocalProp>FirstOverrideValue</TreatedAsLocalProp>
    </PropertyGroup>

    <Import Project="import.props" />

    <PropertyGroup>
        <TreatedAsLocalProp Condition=" '$(TrySecondOverride)' == 'true' ">SecondOverrideValue</TreatedAsLocalProp>
    </PropertyGroup>

    <Target Name="Go">
        <Warning Text="TreatedAsLocalProp($(MSBuildThisFileName)): $(TreatedAsLocalProp)" />
    </Target>
</Project>
<!-- import.proj -->
<Project TreatAsLocalProperty="TreatedAsLocalProp">
    <PropertyGroup>
        <TreatedAsLocalProp>ImportOverrideValue</TreatedAsLocalProp>
    </PropertyGroup>

    <!-- Here, TreatedAsLocalProp has the value "ImportOverrideValue"-->
</Project>

다음과 같이 전역 값을 TreatedAsLocalProp 빌드 importer.proj 하고 설정한다고 가정합니다.

dotnet msbuild .\importer.proj -p:TreatedAsLocalProp=GlobalOverrideValue

출력은 다음과 같습니다.

importer.proj(9,9): warning : TreatedAsLocalProp(importer.proj): GlobalOverrideValue

이제 다음과 같은 속성을 TrySecondOverride 사용하여 빌드한다고 가정합니다 true.

dotnet msbuild .\importer.proj -p:TreatedAsLocalProp=GlobalOverrideValue -p:TrySecondOverride=true

출력은 다음과 같습니다.

importer.proj(13,9): warning : TreatedAsLocalProp(importer.proj): SecondOverrideValue

이 예제에서는 가져온 파일 내에서뿐만 아니라 특성을 사용한 가져온 프로젝트 TreatAsLocalProperty 이후 속성이 로컬로 처리됨을 보여 집니다. 속성 값은 전역 재정의 값의 영향을 받지만 사용된 가져온 프로젝트 TreatAsLocalProperty 이전에적용됩니다.

자세한 내용은 Project 요소(MSBuild)방법: 동일한 원본 파일을 다른 옵션을 사용하여 빌드를 참조하세요.

속성 함수

.NET Framework 버전 4부터는 속성 함수를 사용하여 MSBuild 스크립트를 평가할 수 있습니다. MSBuild 작업을 사용하지 않고도 시스템 시간을 읽고 문자열을 비교하며 정규식을 일치시키고 빌드 스크립트 내에서 여러 가지 다른 작업을 수행할 수 있습니다.

문자열(인스턴스) 메서드를 사용하면 모든 속성값에 대해 작업을 수행할 수 있으며 대부분의 시스템 클래스에 대해 정적 메서드를 호출할 수 있습니다. 예를 들어 다음과 같이 빌드 속성을 오늘 날짜로 설정할 수 있습니다.

<Today>$([System.DateTime]::Now.ToString("yyyy.MM.dd"))</Today>

자세한 내용 및 속성 함수 목록은 속성 함수를 참조하세요.

속성에 XML 저장

속성은 작업에 값을 전달하거나 로깅 정보를 표시하는 데 사용할 수 있는 임의의 XML을 포함할 수 있습니다. 다음 예제에서는 XML 및 기타 속성 참조를 포함하는 값이 있는 ConfigTemplate 속성을 보여 줍니다. MSBuild는 해당 속성 값을 사용하여 속성 참조를 바꿉니다. 속성값은 나타나는 순서대로 할당됩니다. 따라서 이 예제의 경우 $(MySupportedVersion), $(MyRequiredVersion), $(MySafeMode)가 이미 정의되어 있어야 합니다.

<PropertyGroup>
    <ConfigTemplate>
        <Configuration>
            <Startup>
                <SupportedRuntime
                    ImageVersion="$(MySupportedVersion)"
                    Version="$(MySupportedVersion)"/>
                <RequiredRuntime
                    ImageVersion="$(MyRequiredVersion)"
                    Version="$(MyRequiredVersion)"
                    SafeMode="$(MySafeMode)"/>
            </Startup>
        </Configuration>
    </ConfigTemplate>
</PropertyGroup>