2011-08-10 1 views
3

참고 : 저는 지금 Mercurial을 예제로 사용하고 있습니다. 왜냐하면 이것이 내가 지금 MSBuild와 함께 작업하기 위해 노력하고 있기 때문입니다.
그러나 문제는 Mercurial에 국한되지 않고 내 외부 프로그램의 어딘가 내 %PATH% 변수에 발생합니다 (예 : PowerShell과 동일하게 시도했습니다).
그래서 Mercurial 태그가 의도적으로이 질문에 표시되지 않았습니다. Mercurial 태그가 아니기 때문입니다!
내 % PATH %에서 MSBuild를 사용하여 프로그램을 어떻게 실행할 수 있습니까?

실제로하고 싶은 일 :
내 Mercurial 저장소에서 현재 개정 번호를 가져 와서 파일에 저장하려면 내 빌드 스크립트를 원합니다. 명령 줄에서이 작업을 수행하는
가장 간단한 방법은 다음과 같습니다 의욕이 내 컴퓨터에 설치되어 있고 설치 폴더 내 %PATH% 변수에

hg id -i >rev.txt 

.
그래서이 행은 내 컴퓨터의 어디에서나 (명령 줄 또는 배치 파일에서 직접) 실행할 수 있으며 작동합니다.

빌드 스크립트에서이 줄을 실행하려고하면 문제가 발생합니다. 다음과 같이
나는 나의 .csproj 파일의 BeforeBuild (또는 AfterBuild) 섹션을 변경

<Target Name="AfterBuild"> 
    <Exec Command="hg id -i >rev.txt"/> 
</Target> 

내가 비주얼 스튜디오 내 솔루션을 컴파일 작동하고 rev.txt 파일이 어디 폴더에 만들어집니다 내 .csproj가 있습니다.

명령 "HG 아이디 -i> rev.txt"로 종료 : 내가 MSBuild를 사용하여 명령 줄에서 동일한 솔루션을 컴파일 할 때

는하지만, 빌드는 다음과 같은 오류 메시지와 함께 실패 코드 9009

나는 "msbuild를 코드 9009"을 봤 및 somesolutions 찾았지만, 그들 모두는 실행 파일의 전체 경로를 제공하기 위해 제안한다.
이렇게하면 MSBuild에서도 빌드가 성공합니다.
하지만 내 프로젝트 (빌드 서버 포함)를 사용하는 모든 사람이 Mercurial을 정확히 같은 폴더에 설치했는지 확신 할 수 없기 때문에이 방법이 저에게는 용인 할만한 솔루션이 아닙니다. 내가 빌드 스크립트에 직접 <Exec Command="... 줄을 추가 할 때 %PATH%가 ...

같은 정확히 무엇
발생합니다.
실행 파일의 경로를 지정하면 작동합니다.
경로를 지정하지 않으면 경로가 지정되지 않습니다.

완전한 폴더를 지정하지 않고 변수 %PATH%에 MSBuild 프로그램을 실행하는 트릭이 있습니까?


편집 :

@leppie :

출력 리디렉션 : 당신은 내가 대신 명령 내부의 텍스트 파일 내 명령의 출력을 저장한다는 사실을 의미
hg id -i을 명령으로 실행하고 출력 매개 변수 또는 이와 유사한 것을 사용하여 출력을 얻으려면 어떻게해야합니까?
아무런 차이가 없습니다 ... >rev.txt을 생략하면 오류가 동일합니다.

명령 줄 args :
아니오, 매개 변수없이 바로 명령을 hg으로 줄여도 동일한 오류가 발생합니다.

잊지 말아야 할 것 : Visual Studio의 똑같은 .csproj 파일에서 정확히 동일한 Exec 명령을 실행하거나 명령의 .exe 파일 경로 만 제공하면 모든 것이 작동합니다.
그래서 IMO 출력 리디렉션과 명령 줄 args는 문제가 될 수 없습니다.

+0

문제가 출력 재 및 가능 명령 행 인수로한다. Exec 작업에서 이러한 옵션을 제공하지 않습니까? – leppie

답변

1

좋아, 해결책을 찾았습니다.
내가 인정해야 , 그것은 내가 어쩌면이 같은 실수를 만든 사람을 도움이 될 것입니다, 어쨌든 그것을 설명 할 것

:-) PEBKAC의 고전적인 사건이었다 (나는 시도 기본적으로 모든

을 플러스 무엇 제임스 Woolfenden는 그의 대답에 제안) ... 일을했을 것이 내가 빌드 스크립트를 실행하는 데 사용하는 경우에만 배치 파일은 다음과 같이보고하지 않았을 경우 :

path="%windir%\Microsoft.net\Framework\v4.0.30319" 

msbuild build.proj 

예, 정확하게.
이 배치 파일의 지속 기간 동안 %PATH% 변수를 편집 중이며 을 추가하는 대신 대신 MSBuild 경로를 사용하여을 덮어 씁니다.

그래서 내 빌드 스크립트가 Mercurial을 호출하려고하면 더 이상 변수가 %PATH%이 아니기 때문에 더 이상 찾을 수 없습니다.
왜 내가 전에 이것을 보지 못했는지 알 수 없습니다.

올바른 방법은 그대로 다른 경로를 떠나 APPEND MSBuild를 패스하는 것 :

path=%path%;%windir%\Microsoft.net\Framework\v4.0.30319 
1

mercurial/msbuild에이 확장 팩을 사용해 보셨습니까? http://msbuildhg.codeplex.com/documentation

수정 ID를 반환하는 작업이있는 것 같습니다.

<HgVersion LocalPath="$(MSBuildProjectDirectory)" Timeout="5000"> 
    <Output TaskParameter="Revision" PropertyName="AssemblyRevision" /> 
</HgVersion> 
+0

이 질문을하기 전에 이미 MSBuild 버전 관리 (http://versioning.codeplex.com/)를 시도했는데 같은 동작을합니다. Visual Studio에서 빌드가 트리거되고 빌드가 MSBuild에서 트리거 될 때 작동합니다. 그것은 hg.exe를 찾을 수 없다고 말합니다. –

+0

제안 후 MSBuild Mercurial Tasks (http://msbuildhg.codeplex.com)도 시도했지만 전혀 작동하지 않습니다 ... 항상 hg.exe를 찾을 수 없다고 말합니다. Visual Studio 나 MSBuild에서 직접 실행하면 문제가 발생합니다. –