在对vcvarsall.bat进行编号后,从ant执行msbuild

时间:2014-08-27 08:49:46

标签: c++ batch-file visual-studio-2008 ant msbuild

早上好, 我正在尝试使用VS2008编译器(msbuild)使用Ant编译C ++项目。 这是我的操作顺序:

<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>

问题是,当我从目标msbuildSln调用msbuild时,环境变量实际上没有设置我有这样的消息:

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)设置环境。全局vcvarsall.bat的变量
3)对我的Ant脚本进行双重调用,修改mt setEnv.bat:
call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x64 %* ant -f mybuild.xml msbuildSln 设置类似于default =“setEnv”并从msbuildSln目标中的setEnv中删除dependece。

我正在采用最后的解决方案,但我不知道它是否会影响性能。但最重要的一点是有一种方法来设置和使用vcvarsall.bat和msbuild在一起,因为我必须做很多步骤(比如从svn结账,构建解决方案等......)而我想用Ant做完而不是全部在.bat文件中。 感谢。

1 个答案:

答案 0 :(得分:2)

执行第一个cmd

  • 它产生一个新的shell(继承当前shell的当前环境,即ant进程)。
  • 当该命令完成时,shell将被销毁,并且它可能已创建的任何非持久性更改(例如设置变量)都将丢失。

即使您的setEnv.bat使用 setx 命令永久设置环境变量,它也不可用于以下ant语句/目标,因为当前环境(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>