2014-08-27 46 views
2

早上好, 我正在嘗試使用VS2008編譯器(msbuild)編譯Ant的C++項目。 這是我的操作順序:在lanching之後從ant執行msbuild vcvarsall.bat

<target name="setEnv" > <exec dir="." executable="cmd"> <arg line="/c setEnv.bat" /> </exec> </target>

其中setEnv.bat設置環境變量的MSBuild使用

@echo off REM Load Visual Studio's build tools call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x64

,並在其後執行該

<target name="msbuildSln" depends="setEnv"> <exec executable="msbuild"> <arg value="${myproj.sln}" /> <arg value="/p:Configuration=Release" /> <arg value="/p:Platform=x64" /> </exec> </target>

問題是,當我加州LL從目標的MSBuild msbuildSln的環境變量沒有在實際上設置我有這樣的信息:

BUILD FAILED C:\Users\workspace\MyProj\mybuild.xml:82: Execute failed: java.io.IOException: Cannot run program "msbuild": CreateProcess error=2, The system cannot find the file specified

我認爲這是CMD範圍的問題,因爲如果我啓動它裏面setEnv.bat運行。 我試過不同的解決方案:
1)從它的文件夾直接調用msbuild並運行我的目標
2)設置env。
call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x64 %* ant -f mybuild.xml msbuildSln 設置類似項目默認=「SETENV」,並在msbuildSln目標去除SETENV的dependece:vcvarsall.bat全球
3)做我的Ant腳本修改噸setEnv.bat兩個人通話的變量。

我採用了最後的解決方案,但我不知道它是否會影響性能。但最重要的一點是有一種方法來設置和使用vcvarsall.bat和msbuild在一起,因爲我必須做很多步驟(如從svn結帳,建立的解決方案等),我想用螞蟻沒有把所有在.bat文件中。 謝謝。

+0

開始螞蟻從Visual Studio命令窗口,即一個內你已經調用了vcvarsall.bat? – stijn 2014-08-27 10:47:35

+0

@stijin已經嘗試使用.bat中的cl.exe進行設置,但我有相同的結果;它設置了變量,但當我回到螞蟻中時我不能使用它們。我也嘗試執行如下所示的:' \t \t \t \t '但我不能執行其他程序,如標籤msbuild。我想我需要一些結構來做嵌套的,它不存在於Ant中。 – albin0 2014-08-27 14:46:46

回答

2

當你執行你的第一個cmd

  • 它生成一個新的外殼(繼承了當前shell,目前的環境下,即ant過程)。
  • 該命令完成後,shell將被銷燬,並且它可能創建的任何非持久性更改(如設置變量)都將丟失。

即使你setEnv.bat使用setx命令永久設置環境變量,它不會提供給下面的螞蟻報表/目標,因爲目前的環境(ant進程)不會有新的環境直到它重新啓動並再次產生系統。

我剛剛注意到你的setEnv.bat只是調用另一批......爲什麼不直接調用該批?

您需要在同一個shell中調用您的setEnv.batmsbuild,即cmd聲明:

<exec dir="." executable="cmd"> 
    <arg line="/c setEnv.bat &amp; msbuild ${myproj.sln} /p:Configuration=Release /p:Platform=x64" /> 
</exec> 

注寫一個命令行&

的可讀性一個可選的語法要求&amp;

<exec dir="." executable="cmd"> 
    <arg value="/c" /> 
    <arg value="setEnv.bat" /> 
    <arg value="&amp;" /> 
    <arg value="msbuild" /> 
    <arg value="${myproj.sln}" /> 
    <arg value="/p:Configuration=Release" /> 
    <arg value="/p:Platform=x64" /> 
</exec> 
+0

偉大的你救了我。非常感謝 !! – albin0 2014-08-29 14:42:27