디버그 빌드 전용 Visual Studio 빌드 후 이벤트를 실행하는 방법


592

빌드 후 이벤트를 한 유형의 빌드에서만 실행하도록 제한하려면 어떻게해야합니까?

이벤트를 사용하여 DLL 파일을 로컬 IIS 가상 디렉터리에 복사하고 있지만 릴리스 모드의 빌드 서버에서는 이러한 일이 발생하지 않습니다.

답변:


746

사전 및 사후 빌드 이벤트는 배치 스크립트로 실행됩니다. 에 조건문을 작성할 수 있습니다 $(ConfigurationName).

예를 들어

if $(ConfigurationName) == Debug xcopy something somewhere

7
이상한, 어쩌면 그냥 나이지만 if 조건을 추가하려고 시도했지만 이제이 오류가 발생합니다-오류 코드 255로 종료 됨
Michael L

101
나는 전체 명령 요구 한 줄에있을 것으로 나타났습니다하거나 "코드 255로 종료"거야
로빈 민토

7
풀러 솔루션을 위해 gotos / 라벨을 사용할 수도 있습니다 (7 월 24 일 답변 참조)
CestLaGalere

11
if 명령에 대괄호를 사용할 수 있습니다 (예는 내 답변 참조)
gbjbaanb

1
대상 디렉토리에서 파일을 덮어 쓰려면 "xcopy / Y"를 사용해야합니다.
Matthias

521

참고로 goto를 사용할 필요는 없습니다. 쉘 IF 명령은 대괄호와 함께 사용할 수 있습니다.

if $(ConfigurationName) == Debug (
  copy "$(TargetDir)myapp.dll" "c:\delivery\bin" /y
  copy "$(TargetDir)myapp.dll.config" "c:\delivery\bin" /y
) ELSE (
  echo "why, Microsoft, why".
)

62
나는 또한 오류 코드가 생성됩니다 다음 줄에 인 것처럼, 바로 if 문을 수행 할 필요가 여는 괄호의주의를, 추가 할 수 있습니다
wonea

37
"$(ConfigurationName)"오류 코드 255가 발생하면 따옴표를 사용하십시오.
jgauffin

20
참고로 $ (ConfigurationName) 주위에 ""를 사용하는 경우 Debug too-셸 명령 IF 문도 .. 리터럴 ...이라는 단어를 인용 부호로 묶어야합니다.
gbjbaanb 8

5
참고로, 255를 제거하려면 $ (about) 주위에 ""를 사용하고 조건 주위에 공백을 제거해야합니다 (예 : "$ (ConfigurationName)"== "Release"<-주위에 공백 없음 ==
fhilton

15
내 경우에는 Visual Studio 2017 $(ConfigurationName)이 비어 있습니다 (빌드 후 이벤트 명령 줄). if "$(Configuration)" == "Debug"나를 위해 일했다. BTW, 다른 모든 설정에서 무언가를하고 싶다면을 사용하십시오 if NOT "$(Configuration)" == "Debug".
Ralf Hundewadt 2016 년

125

일반적인 빌드 후 이벤트를 추가하십시오. 그런 다음 프로젝트를 저장하고 메모장 (또는 선호하는 편집기) 에서 열고 PostBuildEvent 속성 그룹에 조건을 추가하십시오. 예를 들면 다음과 같습니다.

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>

5
이것은 작동하지만 프로젝트 파일 소스의 이벤트에 대한 모든 디자인 작업을 수행해야합니다. 다른 조건부 빌드 이벤트 선언도 IDE에서 숨겨져 있습니다.
Joseph Daigle

3
나는 이것이 더 나은 대답이라고 말해야 할 것입니다. 바람직한 방법은 효과가 없었습니다.
Michael L

8
메모장에서 열 필요는 없으며 Visual Studio에서 계속 사용할 수 있습니다. 프로젝트 파일을 마우스 오른쪽 단추로 클릭하고 "프로젝트 언로드"를 클릭 한 다음 다시 마우스 오른쪽 단추를 클릭하고 "편집"을 클릭하십시오. 이제 구문 색상으로 {{csproj}} 파일을 편집 할 수 있습니다. 다시 마우스 오른쪽 버튼을 클릭 한 다음 "프로젝트 다시로드"를 클릭하여 다시로드하십시오.
Abel

1
이 접근법은 내가 시도했을 때 PostBuildEvent 명령 자체에서 매크로를 확장하지 않았습니다. cd "$(ProjectDir)"로 확장되었습니다 cd "".
Darryl

3
VS 2017에서는으로이 작업을 수행 할 수도 있습니다 <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>. 매크로 변수와 모든 것이 정상적으로 작동합니다.
SC

106

또는 (이벤트가 배치 파일에 저장된 후 호출되므로) 배치 파일이 아닌 빌드 이벤트 상자에서 다음을 사용하십시오.

if $(ConfigurationName) == Debug goto :debug

:release
signtool.exe ....
xcopy ...

goto :exit

:debug
' Debug items in here

:exit

이 방법은 당신이 어떤 구성을위한 이벤트가, 여전히 다소 배치 파일로 전달하는 것보다 매크로와 그것을 관리하고, 그 기억이 %1있다 $(OutputPath)


6
리플렉터에서 일부 코드를 볼 수있는 기회가 생기면 컴파일러는 많은 스위치 / 케이스 문을 goto로 변환합니다.
StingyJack

10
대부분의 모든 컴파일러는 코드를 goto와 같은 간단한 명령어로 변환합니다. 리버스 엔지니어링은 더보기 쉬운 "좋은"더 복잡한 명령어에 간단한 명령어를 조합 할 수 없습니다. Microsoft가 goto를 사용하도록하는 방법이나 이것이이 게시물과 어떤 관련이 있는지 잘 모르겠습니다.
TamusJRoyce

1
@StingyJack : 컴파일 된 코드를 보면 모든 코드가 JMP 명령어로 바뀐 것을 볼 수 있습니다. (goto를 사용하는 것이 때때로 읽기가 쉽지 않은 것은 아닙니다)
gbjbaanb

빌드 후 명령을 배치 안에 넣으면 빌드를 누를 때이 오류 메시지가 나타납니다.Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Sebastian

4
원하는 경우 다음을 제거 if하고 사용할 수 있습니다goto :$(ConfigurationName)
Calimero100582

15

Visual Studio 2015 : 올바른 구문은 다음과 같습니다 (한 줄에 유지).

if "$(ConfigurationName)"=="My Debug CFG" ( xcopy "$(TargetDir)test1.tmp" "$(TargetDir)test.xml" /y) else ( xcopy "$(TargetDir)test2.tmp" "$(TargetDir)test.xml" /y)

255 오류가 없습니다.


3
한 줄에 그것을 유지
에릭 나무의 줄기-Feysot에게

잘 작동합니다. Tks
Vinicius Gonçalves

1
귀하의 조건부 기술이 저에게 가장 효과적이었습니다. 그러나 이것은 조건부없이 전혀 더 잘 작동했으며 훨씬 간결합니다. "$ (ProjectDir) \ .. \ $ (ConfigurationName) \ MyFileName" "$ (TargetDir)"
shawn1874

1
스크립트가 정확하지만 내 스크립트를 사용하면 구성마다 다른 파일을 복사 할 수 있습니다.
Eric Bole-Feysot

8

Visual Studio 2019부터 최신 .csproj형식은 Target요소에 직접 조건을 추가 할 수 있도록 지원합니다 .

<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
    <Exec Command="nswag run nswag.json" />
</Target>

UI는이를 설정하는 방법을 제공하지 않지만 UI Configuration를 통해 변경하면 속성을 그대로 유지하는 것처럼 보입니다 .


이것은 VS 2019에서 나를 위해 일했습니다. 감사합니다!
BrandoTheBrave

이것은 실제로 더 높아야 할 자격이 있으며 UI를 업데이트하여 빌드 구성을 표시하거나 적어도 csproj 속성에서 조건을 추가 할 수 있도록해야합니다.
DeadlyChambers

4

구성 이름을 빌드 후 스크립트에 전달하고 체크인하여 실행해야하는지 확인할 수 있습니다.

로 구성 이름을 전달하십시오 $(ConfigurationName).

이를 확인하는 것은 빌드 후 단계를 구현하는 방법을 기반으로하며 명령 행 인수가됩니다.


-1

이것은 Visual Studio 2015에서 작동합니다.

솔루션 폴더와 같은 수준의 라이브러리 폴더에있는 폴더의 모든 DLL 파일을 빌드중인 프로젝트의 대상 디렉토리에 복사합니다.

내 프로젝트 디렉토리의 상대 경로를 사용하고 .. \ .. \ lib를 사용하여 폴더 구조를 두 단계 올립니다.

MySolutionFolder
.... MyProject
Lib

if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")

-2

모든 프로젝트 설정과 마찬가지로 빌드 이벤트는 구성별로 구성 할 수 있습니다. 속성 페이지 대화 상자의 드롭 다운에서 변경하려는 구성을 선택하고 빌드 후 단계를 편집하십시오.


10
빌드 이벤트는 IDE에서 생성 될 때 특정 구성과 관련이 없습니다.
Joseph Daigle

1
VS2015에서도 작동하지 않습니다. 구성별로 구성 할 수 없습니다.
willem

2
이뿐만 아니라 C #, Visual Studio에서 C ++ 프로젝트에 적용
bytecode77

-3

Visual Studio 2012에서는 사용해야합니다 (Visual Studio 2010에서도 생각합니다)

if $(Configuration) == Debug xcopy

$(ConfigurationName) 매크로로 표시되었지만 할당되지 않았습니다.

여기에 이미지 설명을 입력하십시오

비교 : 빌드 명령 및 속성에 대한 매크로


7
ConfigurationName을 사용하려고합니다. 이 이미지는 ... 모든 흐림 효과를 이해하기가 정말 어렵습니다.
Stealth Rabbi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.