로컬 빌드 사용자 지정

GitHub, 소스 제어 또는 공유 코드베이스와 같은 코드 리포지토리를 사용하는 팀에서 작업하지만 로컬 컴퓨터에서 빌드를 사용자 지정하려는 경우 일시적으로 버그를 재현하거나 다른 구성을 테스트하려는 경우 이러한 사용자 지정을 공유 코드 리포지토리와 공유된 공유 프로젝트 파일과 별도로 유지하는 것이 편리할 수 있습니다. 이 문서에서는 사용자별 또는 로컬 전용 사용자 지정 구성을 만들 수 있는 MSBuild에서 사용할 수 있는 일부 빌드 확장에 대해 설명합니다.

.user 파일

이 컨텍스트에서 .user 파일이라고도 하는 $(MSBuildProjectFullPath).user를 사용하는 옵션도 있습니다. 이 파일은 로컬 컴퓨터와 관련된 확장, 옵션 또는 변수를 유지하기 위한 것입니다. 소스 제어에 업로드할 수 없으며 .gitignore에서 자동으로 검사됩니다. 더 광범위한 변경의 경우 프로젝트 자체를 변경하는 것이 좋으므로 미래의 관리자가 이 확장 메커니즘에 대해 알 필요가 없습니다.

지원되는 다중 대상 프로젝트에서 .user 파일은 내부 빌드 및 외부 빌드에서 자동으로 가져오므로 솔루션 내에서 파일을 만들 수 있습니다. 다른 유형의 빌드에서 작업하는 경우에도 .user 파일을 사용할 수 있습니다. 솔루션 내에서 만든 다음 프로젝트 파일에서 가져올 수 있습니다.

<Import Project="$(MSBuildProjectFullPath).user" Condition="Exists('$(MSBuildProjectFullPath).user')"/>

MSBuildExtensionsPath 및 MSBuildUserExtensionsPath

관례상 많은 핵심 빌드 논리 파일 가져오기는

$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\{TargetFileName}\ImportBefore\*.targets

해당 콘텐츠 전과 후에

$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\{TargetFileName}\ImportAfter\*.targets

이루어집니다. 이 규칙을 사용하면 설치된 SDK에서 공용 프로젝트 형식의 빌드 논리를 확장할 수 있습니다.

동일한 디렉터리 구조는 사용자당 폴더 %LOCALAPPDATA%\Microsoft\MSBuild$(MSBuildUserExtensionsPath)에서 검색됩니다. 해당 폴더에 있는 파일을 해당 사용자의 자격 증명으로 실행되는 해당 프로젝트 형식의 모든 빌드에 가져옵니다. 사용자 확장은 패턴 ImportUserLocationsByWildcardBefore{ImportingFileNameWithNoDots}에서 가져오는 파일에 따라 명명된 속성을 설정하여 비활성화할 수 있습니다. 예를 들어 ImportUserLocationsByWildcardBeforeMicrosoftCommonPropsfalse로 설정하면 $(MSBuildUserExtensionsPath)\$(MSBuildToolsVersion)\Imports\Microsoft.Common.props\ImportBefore\* 가져오기를 방지합니다.

프로젝트 언어를 기반으로 하는 사용자 지정 구성

.NET 언어(C#, Visual Basic 또는 F#)에 따라 다른 동작이 필요한 경우 $(MSBuildProjectExtension)의 프로젝트 파일 확장명에 따라 언어별 속성 및 해당 값을 정의하는 조건이 있는 속성 그룹을 추가할 수 있습니다.

<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.vbproj'">
   <!-- Put VB-only property definitions here -->
</PropertyGroup>
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.fsproj'">
   <!-- Put F#-only property definitions here -->
</PropertyGroup>
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.csproj'">
   <!-- Put C#-only property definitions here -->
</PropertyGroup>