2011-08-10 47 views
3

注意:我在這裏使用Mercurial作爲示例,因爲這就是我現在想要使用MSBuild的工作。
但問題不僅限於Mercurial,它發生在我的%PATH%變量中某處的每個外部程序(例如,我嘗試了與PowerShell相同的程序)。
所以我沒有特意將Mercurial標籤放在這個問題上,因爲這不是Mercurial!
如何在MSBuild的%PATH%中執行程序?

我真正想要做的:
我希望我的構建腳本來從我的Mercurial庫得到當前的版本號,並將其存儲在一個文件中。
在命令行完成此操作的最簡單方法是:

hg id -i >rev.txt 

Mercurial是安裝在我的機器上安裝文件夾在我的%PATH%變量。
因此,我可以從我的機器上的任何位置(直接從命令行或從批處理文件)運行此行,並且它正常工作。

當我嘗試從構建腳本運行此行時會發生此問題。
我改變我的.csproj文件的BeforeBuild(或AfterBuild)部分,如下所示:

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

當我編譯我的Visual Studio解決方案,它的工作原理,並在文件夾中創建rev.txt文件,其中我.csproj是。

但是,當我編譯從與MSBuild的命令行完全相同的溶液,將生成失敗,錯誤如下消息:

命令「汞柱ID -i> rev.txt」與退出代碼9009

我用Google搜索「的MSBuild代碼9009」,發現somesolutions,但他們的建議提供完整的可執行文件路徑。
當我這樣做時,構建也成功與MSBuild。
但是這對我來說不是一個可以接受的解決方案,因爲我不能確定每個使用我的項目(包括構建服務器)的人都已經在完全相同的文件夾中安裝了Mercurial。
這正是%PATH%是...

同樣的情況,當我把<Exec Command="...線直接進入構建腳本。
如果我指定可執行文件的路徑,它就可以工作。
如果我沒有指定路徑,它不會。

是否有任何技巧讓我的%PATH%變量中的MSBuild執行程序沒有指定完整的文件夾?


編輯:

@leppie:

輸出重定向:
你說的是事實,我救我的命令的輸出命令內的文本文件,而不是隻是運行hg id -i作爲一個命令,並使用輸出參數或類似的東西來獲得輸出?
沒有什麼區別...錯誤是相同的,當我省略>rev.txt

命令行參數:
沒有,它拋出了同樣的錯誤,即使我縮短命令只hg(不帶任何參數)。

不要忘記:如果我在Visual Studio中完全相同的.csproj文件中運行完全相同的Exec命令,或者只是在命令中提供了.exe文件的路徑,那麼一切正常。
因此IMO輸出重定向和命令行參數不能成爲問題。

+0

問題是與輸出重定向以及可能的命令行參數。執行任務是否不提供這些選項? – leppie

回答

1

好的,我找到了解決方案。
我不得不承認,這是的PEBKAC的經典案例:-)

無論如何,我會解釋它,也許它會幫助別人誰做了同樣的錯誤:

基本上一切我都試過(加詹姆斯·Woolfenden在他的回答提出)會一直工作...如果只是我用來運行構建腳本批處理文件就不會是這個樣子的:

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

msbuild build.proj 

是的,沒錯。
我正在編輯這個批處理文件持續時間的%PATH%變量,而我覆蓋它與MSBuild的路徑而不是隻是它追加它。

所以,當我的構建腳本試圖調用Mercurial時,它不能再找到它,因爲它的位置不再在%PATH%變量中。
不知道爲什麼我以前沒有看到這個。

正確的方法。將追加的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 Versioning(http://versioning.codeplex.com/),它的行爲相同:當它從Visual Studio觸發構建時,以及從MSBuild觸發構建時,它說它找不到hg.exe。 –

+0

我也在你的建議之後嘗試過MSBuild Mercurial Tasks(http://msbuildhg.codeplex.com),但是我無法完成它的工作......它總是說它找不到hg.exe,沒有如果我從Visual Studio或直接從MSBuild運行它的話。 –