빌드 이벤트 지정(C#)

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

빌드 이벤트 지정

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

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

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

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

    참고 항목

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

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

    참고 항목

    .bat 파일을 실행하는 모든 빌드 후 이벤트 명령 앞에 call 문을 추가합니다. 예를 들어 call MyFile.bat 또는 call MyFile.bat call MyFile2.bat입니다. 경로는 프로젝트 폴더의 상대 경로이거나 절대 경로일 수 있습니다.

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

    참고 항목

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

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

  2. 프로젝트 메뉴에서 (ProjectName) 속성을 클릭하거나, 솔루션 탐색기에서Alt+Enter를 누릅니다.

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

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

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

    참고 항목

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

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

    참고 항목

    .bat 파일을 실행하는 모든 빌드 후 이벤트 명령 앞에 call 문을 추가합니다. 예를 들어 call MyFile.bat 또는 call MyFile.bat call MyFile2.bat입니다. 경로는 프로젝트 폴더의 상대 경로이거나 절대 경로일 수 있습니다.

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

빌드 이벤트 명령 만들기

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

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

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

프로젝트 파일에서:

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

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

빌드 이벤트는 Command로 지정한 입력이 있는 Exec 작업을 포함하는 대상으로 표시됩니다. 줄 바꿈은 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는 이러한 모든 시나리오를 지능적으로 처리하도록 설계되었습니다. 빌드 프로세스의 특정 지점 중에 실행할 AfterTargets 또는 BeforeTargets 를 지정하는 사용자 지정 대상을 만드는 것이 좋으며, 고급 시나리오의 추가적인 제어를 위해 사용자 지정 작업을 만들거나 사용자 지정 빌드를 다양하게 만드는게 좋습니다.

예시

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