다음을 통해 공유


빌드 이벤트 지정(C#)

빌드 이벤트를 사용하여 빌드가 시작되기 전 또는 빌드가 완료된 후에 실행되는 명령을 지정합니다.

빌드 이벤트 지정

  1. 솔루션 탐색기빌드 이벤트를 지정할 프로젝트를 선택합니다.

  2. 프로젝트 메뉴에서 속성클릭합니다.

  3. 빌드 이벤트 탭을 선택합니다.

  4. 빌드 전 이벤트 명령줄 상자에서 빌드 이벤트의 구문을 지정합니다.

    메모

    프로젝트가 최신 상태이고 빌드가 트리거되지 않으면 빌드 전 이벤트가 실행되지 않습니다.

  5. 빌드 후 이벤트 명령줄 상자에서 빌드 이벤트의 구문을 지정합니다.

    메모

    call 파일을 실행하는 모든 빌드 후 명령 앞에 문을 추가합니다. 예를 들어 call MyFile.bat 또는 call MyFile.bat call MyFile2.bat. 경로는 절대 경로이거나 출력 폴더를 기준으로 할 수 있습니다.

  6. 빌드 후 이벤트 실행 상자에서 빌드 후 이벤트를 실행할 조건을 지정합니다.

    메모

    긴 구문을 추가하거나 빌드 전 이벤트/빌드 후 이벤트 명령줄 대화 상자빌드 전 명령줄 대화 상자에서 빌드 매크로를 선택하려면 줄임표 단추(...)를 클릭하여 편집 상자를 표시합니다.

  1. 솔루션 탐색기빌드 이벤트를 지정할 프로젝트를 선택합니다.

  2. 프로젝트 메뉴에서 {ProjectName} 속성 클릭합니다(또는 솔루션 탐색기Alt 키를+입력).

  3. 빌드 > 이벤트선택합니다.

    빌드 이벤트 설정을 보여 주는 스크린샷

  4. 빌드 전 이벤트 섹션에서 빌드 이벤트의 구문을 지정합니다.

    메모

    프로젝트가 최신 상태이고 빌드가 트리거되지 않으면 빌드 전 이벤트가 실행되지 않습니다.

  5. 빌드 후 이벤트 섹션에서 빌드 이벤트의 구문을 지정합니다.

    메모

    call 파일을 실행하는 모든 빌드 후 명령 앞에 문을 추가합니다. 예를 들어 call MyFile.bat 또는 call MyFile.bat call MyFile2.bat. 경로는 절대 경로이거나 출력 폴더를 기준으로 할 수 있습니다.

  6. 빌드 후 이벤트 실행 시기 섹션에서 빌드 후 이벤트를 실행할 조건을 지정합니다.

빌드 이벤트 명령 만들기

빌드 이벤트 명령에는 명령 프롬프트 또는 .bat 파일에서 유효한 모든 명령이 포함될 수 있습니다. 사용 가능한 명령은 Windows 명령 참조설명되어 있습니다. 배치 파일의 이름 앞에 call을 붙여야 모든 후속 명령이 실행됩니다. 일괄 처리 파일 자체는 출력 폴더(예: bin/Debug)에서 실행됩니다. 모든 구성에 동일한 일괄 처리 파일이 필요한 경우 프로젝트 파일과 동일한 폴더에 배치하고 상대 경로(예: call ../../prebuild.bat)를 사용할 수 있습니다.

같은 명령을 입력하여 PowerShell MyPowerShellScript.ps1 스크립트를 실행할 수 있습니다. PowerShell 스크립트의 경로는 절대 경로이거나 프로젝트 디렉터리를 기준으로 할 수 있습니다. 스크립트를 실행하려면 운영 체제의 PowerShell 스크립트에 대한 실행 정책이 적절하게 설정되어 있는지 확인해야 합니다. 실행 정책에 관해 을 참조하세요.

bash와 같은 다른 셸을 사용하려는 경우 일반적으로 Windows 명령 프롬프트에서 셸 스크립트를 시작하는 데 사용하는 것과 동일한 명령 구문을 사용합니다. 타사 셸 사용은 이 설명서의 범위를 벗어나지만 Stack Overflow와 같은 사이트가 유용할 수 있습니다.

프로젝트 파일에서

이전 단계를 수행할 때 Visual Studio는 PreBuild 또는 PostBuild 대상과 제공한 단계를 실행하는 데 필요한 MSBuild 코드를 추가하여 프로젝트 파일을 수정합니다. 프로젝트 파일을 열고 단계를 볼 수 있습니다. 프로젝트 파일의 단계를 수정하는 것은 괜찮습니다. 변경 내용을 저장한 후 프로젝트 속성의 빌드 > 이벤트 섹션에 변경 내용이 표시됩니다.

<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
  <Exec Command="call prebuild.bat" />
</Target>

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
  <Exec Command="call postbuild.bat" />
</Target>

Exec 요소는 MSBuild Exec 작업을 참조합니다. 실행을 사용자 지정하는 데 사용할 수 있는 다른 매개 변수에 대한 자세한 내용은 Exec 작업 참조하세요. 예를 들어 WorkingDirectory 사용하여 실행 파일이 실행되는 폴더를 설정할 수 있습니다. 기본값은 프로젝트 파일을 포함하는 디렉터리입니다.

<Exec Command="call prebuild.bat" WorkingDirectory="$(OutDir)">

OutDir이 문서의 뒷부분에서 설명한 대로 이전 예제의 같은 MSBuild 속성(매크로)을 사용할 수 있습니다.

오류 및 기타 출력

빌드 이벤트의 출력은 출력 창빌드 섹션에 기록됩니다. 열려면 보기>기타 창, 출력 창을 선택하거나, Ctrl+Alt+O키를 누릅니다. 출력 표시옆의 드롭다운에서 빌드 선택합니다.

빌드 전 또는 빌드 후 이벤트가 성공적으로 완료되지 않은 경우 0이 아닌 코드로 이벤트 작업을 종료하여 빌드를 종료할 수 있습니다. 0 종료 코드는 성공적인 작업을 나타냅니다. 다른 종료 코드는 오류로 간주됩니다.

빌드 전 이벤트가 실패하면 오류 목록 창에 다음과 같은 오류가 표시될 수 있습니다.

MSB3073    The command "call c:\source\repos\prebuild.bat" exited with code 1.

오류 목록 창에 정보가 충분하지 않은 경우 출력 창 사용하여 일괄 처리 파일의 출력을 포함하여 전체 빌드 출력을 볼 수 있습니다.

오류 목록 창은 이벤트에 대해 입력한 첫 번째 줄인 한 줄의 출력으로 제한됩니다. 오류 목록 창 출력이 중요한 경우 이벤트에 둘 이상의 줄을 배치하지 마십시오. Windows 명령 프롬프트 또는 운영 체제에서 일괄 처리 파일을 만든 다음 이벤트에 대한 call mybatchfile.bat 사용합니다. 일괄 처리 파일 자체에 명령을 포함합니다.

일괄 처리 파일에서 사용할 수 있는 명령에 대한 지침은 Windows 명령참조하세요.

매크로

일반적으로 사용할 수 있는 "매크로"(실제로 MSBuild 속성)는 MSBuild 공통 속성나열됩니다. .NET SDK 프로젝트(.NET Core 또는 .NET 5 이상)의 경우 Microsoft.NET.Sdk MSBuild 속성에 추가 속성이 나열됩니다.

빌드 이벤트에 대한 스크립트에서 프로젝트 이름 또는 출력 폴더의 위치와 같은 일부 프로젝트 수준 변수의 값을 참조할 수 있습니다. 이전 버전의 Visual Studio에서는 이 매크로들을 매크로라고 불렀습니다. 최신 버전의 Visual Studio에서 매크로와 동일한 값은 MSBuild 속성입니다. MSBuild는 Visual Studio가 빌드를 수행할 때 프로젝트 파일을 처리하는 데 사용하는 빌드 엔진입니다. IDE의 빌드 이벤트는 프로젝트 파일 내에서 MSBuild 의 대상을 생성합니다. 프로젝트 파일의 대상에서 사용할 수 있는 MSBuild 속성(예: $(OutDir) 또는 $(Configuration))을 사용할 수 있습니다. 이러한 이벤트에서 사용할 수 있는 MSBuild 속성은 프로젝트 파일에서 암시적으로 또는 명시적으로 가져온 파일(예: .props.targets 파일) 및 프로젝트 파일에 설정된 속성(예: PropertyGroup 요소)에 따라 달라집니다. 각 속성의 정확한 맞춤법을 사용해야 합니다. 속성을 잘못 입력하면 오류가 보고되지 않습니다. 대신 정의되지 않은 속성은 빈 문자열로 평가됩니다.

예를 들어 다음과 같이 빌드 전 이벤트를 지정한다고 가정합니다.

빌드 전 이벤트 예제를 보여 주는 스크린샷

이 빌드 전 이벤트는 프로젝트 파일에서 Target라는 이름의 다음 항목을 생성합니다.

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="echo Configuration: $(Configuration)&#xD;&#xA;echo DevEnvDir: $(DevEnvDir)&#xD;&#xA;echo OutDir: $(OutDir)&#xD;&#xA;echo ProjectDir: $(ProjectDir)&#xD;&#xA;echo VisualStudioVersion: $(VisualStudioVersion)&#xD;&#xA;echo AssemblySearchPaths: $(AssemblySearchPaths)&#xD;&#xA;echo AssemblyName: $(AssemblyName)&#xD;&#xA;echo BaseIntermediateOutputPath: $(BaseIntermediateOutputPath)&#xD;&#xA;echo CscToolPath: $(CscToolPath)" />
  </Target>

빌드 이벤트는 지정한 입력과 함께 에그젝(Exec task) 태스크를 포함하는 대상으로 나타납니다. 줄 바꿈은 XML로 인코딩됩니다.

이 예제에서 프로젝트를 빌드할 때 빌드 전 이벤트는 일부 속성의 값을 출력합니다. 이 예제에서는 $(CscToolPath) 정의되지 않았기 때문에 출력을 생성하지 않습니다. 프로젝트 파일에서 정의하여 C# 컴파일러의 사용자 지정된 인스턴스에 대한 경로를 제공할 수 있는 선택적 속성입니다(예: 다른 버전의 csc.exe테스트하거나 실험적 컴파일러를 테스트한 경우).

빌드 이벤트의 출력은 출력 창에서 찾을 수 있는 빌드 출력에 기록됩니다. 드롭다운의 출력 표시에서 빌드 선택합니다.

Build started...
1>------ Build started: Project: ConsoleApp4, Configuration: Debug Any CPU ------
1>You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
1>Configuration: Debug
1>DevEnvDir: C:\Program Files\Microsoft Visual Studio\2022\Preview\Common7\IDE\
1>OutDir: bin\Debug\net6.0\
1>ProjectDir: C:\source\repos\ConsoleApp4\ConsoleApp4\
1>VisualStudioVersion: 17.0
1>ALToolsPath:
1>AssemblySearchPaths: {CandidateAssemblyFiles};{HintPathFromItem};{TargetFrameworkDirectory};{RawFileName}
1>AssemblyName: ConsoleApp4
1>BaseIntermediateOutputPath: obj\
1>CscToolsPath:
1>Skipping analyzers to speed up the build. You can execute 'Build' or 'Rebuild' command to run analyzers.
1>ConsoleApp4 -> C:\source\repos\ConsoleApp4\ConsoleApp4\bin\Debug\net6.0\ConsoleApp4.dll

메모

일부 시나리오에서는 빌드 이벤트가 수행할 수 있는 것보다 더 복잡한 빌드 작업이 필요합니다. 예를 들어 많은 일반적인 코드 생성 시나리오의 경우 정리 및 다시 빌드 작업을 처리해야 하며, 코드 생성 단계에 대해 증분 빌드를 사용하도록 설정하여 입력과 관련하여 출력이 오래된 경우에만 단계가 실행되도록 할 수 있습니다. MSBuild는 이러한 모든 시나리오를 지능적으로 처리하도록 설계되었습니다. 빌드 프로세스의 특정 지점에서 실행할 수 있도록 사용자 지정 대상을 생성하는 것을 고려하세요. 더 고급 시나리오에서는 사용자 지정 작업을 생성하거나, 빌드를 사용자 지정할 수 있는 다양한 방법을 검토하세요.

예시

  1. 다음 내용을 사용하여 프로젝트 폴더에 postbuild.bat 일괄 처리 파일을 만듭니다.

    echo Copying output file %1 to %1.copy
    copy %1 %1.copy
    

    일괄 처리 파일에서 %1는 전달된 첫 번째 인수를 참조합니다.

  2. 프로젝트 속성의 빌드 후 이벤트 섹션에서 일괄 처리 파일을 호출하고 MSBuild 속성 $(TargetPath)사용하여 인수를 전달합니다.

    call postbuild.bat $(TargetPath)
    
  3. 프로젝트를 빌드하고 출력 폴더를 확인합니다. 복사한 파일이 빌드된 어셈블리 옆에 표시됩니다. 출력 창빌드 섹션에서 배치 파일의 출력을 볼 수 있습니다.

    1>Output file is C:\source\repos\ConsoleApp-BuildEvents\ConsoleApp-BuildEvents\bin\Debug\net6.0\ConsoleApp-BuildEvents.dll
    1>        1 file(s) copied.
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    ========== Build started at 12:00 PM and took 00.723 seconds ==========