Visual Studio : 여러 빌드 후 명령?


101

Visual Studio 2008을 사용하면 명령을 선언하고 프로젝트의 빌드 후 이벤트에 연결할 수 있습니다. 많은 개발자와 마찬가지로 정기적으로 파일을 응용 프로그램 출력 디렉토리에 xcopy하는 데 사용합니다.

단일 프로젝트 내에서 두 개의 다른 위치에서 두 개의 다른 대상으로 파일을 xcopy해야하는 프로젝트를 진행하고 있습니다. 즉, 동일한 빌드 후 이벤트에서 두 개의 다른 xcopy 명령을 호출해야합니다. 빌드 후 이벤트는 단일 명령 만 사용하며 여러 명령을 호출해야하는 경우 명령을 * .bat 파일에 넣고 빌드 후 이벤트에서 호출해야합니다.

이것이 맞습니까, 아니면 빌드 후 이벤트에서 두 개의 명령을 호출하는 더 간단한 방법이 있습니까? 도움을 주셔서 미리 감사드립니다.

답변:


124

빌드 후 명령을 원하는만큼 입력 할 수 있습니다. 줄 바꿈으로 구분하십시오.

다음은 내 프로젝트 중 하나의 예입니다.

빌드 후 이벤트 명령 줄


3
스크린 샷을 포함하는 것은 영원히 호스팅하려는 경우에만 유용합니다.
Amandalishus 2010 년

1
@ OWenJ23 ... 또는이 경우 'imageshack';)
Anthony Walsh

28
별도의 줄에 있음에도 불구하고 내 명령은 마치 한 줄에있는 것처럼 함께 실행됩니다.
Trevor

6
불행히도 중간 명령 중 하나가 실패하면 적어도 VS2015는 오류를보고하지 않는 것 같습니다. 빌드 후 단계의 결과로 마지막 명령의 결과를보고합니다.
Johannes S.

3
이것은 Visual Studio 내부에서 작동하는 것으로 보이지만 TFS 빌드 컴퓨터에서 MsBuild를 사용하는 경우 지원되지 않습니다. MsBuild는 줄 바꿈을 제거한 다음 잘못된 구문으로 인해 명령을 실패합니다.
제프 B

107

중요 : 배치 파일을 실행할 때 다음 행을 실행하려면 "call"문을 사용해야합니다. "call"을 사용하지 않으면 실행이 .bat로 이동하고 다음 행으로 돌아 가지 않습니다. DOS 프롬프트와 동일합니다.

예 :

call MyBatch1.bat
call MyBatch2.bat

3
이 팁은 모두 배치 파일 (grunt.cmd 및 npm.cmd)을 통해 실행되므로 grunt 및 npm 명령에 적용됩니다.
Matt Varblow

16

또 다른 옵션이 있습니다 &&. 명령을 . 예

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

이것은 줄 바꿈으로 분리하는 것과 정확히 동일하지 않습니다 &&. 이전 명령이 실패하면 다음 명령이 실행되지 않습니다.

줄 바꿈으로 구분하는 것이 읽기 쉽기 때문에 선호해야합니다. 그러나 &&유용 할 때 적어도 한 가지 경우를 알고 있습니다. 속성 시트를 사용하여 서로 다른 시스템에서 서로 다른 빌드 후 단계를 갖는 시나리오입니다. VS 2008에서는 속성 시트에서 PostBuildStep을 직접 설정할 수 없지만 명령으로 사용자 매크로를 추가하고 기본 프로젝트 설정에서 호출 할 수 있습니다. 매크로는 한 줄이므로 &&여러 명령을 사용할 수 있습니다 .


11

각 명령은 별도의 줄에 있어야합니다. 그러나 내가 찾은 것은 이러한 명령 중 하나를 실행하는 동안 오류가 발생하면 전체 빌드 후 전체가 실패하므로 디버깅을 위해 한 번에 하나씩 각 빌드 후 명령을 시도해야한다는 것입니다.


2
"xcopy / f"는 전체 소스 및 대상 파일 이름을 표시하며 실패하기 전에 인쇄되므로 여러 xcopy 명령을 여러 복사 명령보다 쉽게 ​​진단 할 수 있습니다.
yoyo

9

& 또는 && 또는;로 명령 분리 VS2017에서는 작동하지 않습니다. 그런 간단한 기능은 VS2017에서 사용할 수 없다는 것을 믿을 수 없습니다. Visual Studio는 빌드 후 이벤트 창의 전체 텍스트를 하나의 문자열로 실행하려고합니다. 나에게 유일한 옵션은 내가 특별히 좋아하지 않는 배치 스크립트를 만드는 것입니다.


1
&&로 명령을 분리하면 VS2017에서 작동합니다. VS2017 편집기에서 각 명령을 별도의 줄에 지정하면 작동하지 않습니다.
codesniffer

5

womp대답에 추가 :

동일한 빌드 이벤트에서 수행 할 작업이있는 여러 속성 시트가있는 경우 다음을 수행하여 명령을 연결할 수 있습니다.

%(Command)
echo foo

여기서는 %(Command)명령의 이전 값으로 확장됩니다.

개인적으로 현재 상속 된 명령이없는 경우에도 모든 빌드 이벤트에 대해이 작업을 수행합니다. 이렇게하면 나중에 속성 시트를 추가해도 문제가 발생하지 않기 때문입니다.


1
이것은 사용자 지정 빌드 단계에서도 작동합니다. 또한 exit체인을 따라 어디에서나 배치 문을 실행 하면 체인이 중단됩니다. 실제로 exit 1빌드가 실패 exit 0하고 단계를 중단하고 빌드가 계속됩니다.
Martin Connell

3

Visual Studio 2017에서 다음을 수행 할 수 있습니다.

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

1
.csproj를 편집하고 두 개의 postbuild 이벤트 명령 주위에 <Command> </ Command>를 추가했습니다. 작동하지 않는 것 같습니다. Visual Studio의 빌드 이벤트를 살펴보면 두 명령 주위에 <Command> </ Command>가 있었지만 빌드 오류가 발생했습니다. "<Command xmlns =".. "> command1 command2 </ Command>"명령 코드 255로 종료되었습니다.
Jimmy

1

womp가 제안한 접근 방식은 Visual Studio 2015/2017 (Windows)에서 작동하지만 Mac 용 Visual Studio (미리보기)에서는 작동하지 않으며 첫 번째 명령 만 실행하는 것처럼 보입니다. Mac 및 Windows 버전의 Visual Studio에서 작동하는 유일한 방법은 2 개의 MSBuild 명령을 연결하는 것입니다.

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

위의 예제는 "AfterResolveReferences"이벤트를 사용하지만 분명히 PostBuild 이벤트에서도 작동합니다.


1

이 문제에 대한 좋은 해결책이 없습니다. 호출 아이디어로 인해 다른 스크립트가 실행됩니다. 오류 감지가 작동하지 않는 것으로 나타났습니다. 'exit / b 1'을 FailMe.cmd에 넣습니다. 빌드 후 단계에서 'call FailMe.cmd'를 사용합니다. 빌드가 실패하지 않습니까? C # 프로젝트를 빌드하는 VS 2017을 사용하고 있습니다. 이제 'FailMe.cmd'로 시도해보십시오. 이제 빌드가 오류를보고합니다.

따라서 오류보고가 중요한 경우 단일 스크립트를 사용하는 것이 더 나을 수 있습니다.


-4

배치 스크립트에 "call"이라는 접두사를 붙이십시오. 따라서 Batch 스크립트 아래의 명령문도 배치 스크립트에서 호출을 반환 한 후 실행됩니다.

call Script1.cmd
call Script2.bat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.