注意:我在這裏使用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輸出重定向和命令行參數不能成爲問題。
問題是與輸出重定向以及可能的命令行參數。執行任務是否不提供這些選項? – leppie