1

我有以下问题:在操作系统是 Linux 和操作系统是 MacOs 的情况下,我必须执行不同的操作。

所以我创建了以下 Ant 脚本目标:

<condition property="unix">
    <os family="unix" />
</condition>

<condition property="mac">
    <os family="mac" />
</condition>

<target name="initUnixPath" if="unix" depends="clean">
    <echo message="initUnixPath: SETTING UNIX PATH" />
    <property name="path">/usr/share/XCloud/appl/lib/</property>
</target>

<target name="initMacPath" if="mac" depends="clean">
    <echo message="initMacPath: SETTING MAC PATH" />
    <property name="path">${basedir}/../../../Mac/CrystalIce/CrystalIce/CrystalIce/Build/Products/Debug/CrystalIce.app/Contents/Resources/java/</property>
</target>

    <!-- Copy SharedLib jar files: -->
    <!--<copy todir="${basedir}/../../../../../../../../usr/share/XCloud/appl/lib">-->
    <!--<copy todir="/usr/share/XCloud/appl/lib">-->
    <echo message="${path}" />
    <copy todir="${path}">
        <fileset dir="${basedir}/../../SharedLib" />
    </copy>
            ..................................................
            ..................................................
            COPY OTHER FILES

当它去执行init目标时,这个目标取决于initUnixPathinitMacPat目标

于是发生了以下事情:

1)如果我在Linux机器上执行它,它首先执行将路径属性设置为正确值的initUnixPath:“/usr/share/XCloud/appl/lib/”,然后执行initMacPath并且什么都不做,因为Linux机器不是 MacOs 机器。所以执行初始化目标并将文件复制到正确的位置:“/usr/share/XCloud/appl/lib/”

2)如果我在 MacOs 机器上执行它,它首先执行initUnixPath(因为 MacOs 是基于 BSD 的系统,所以它是 UNIX 机器)将路径属性设置为错误值“/usr/share/XCloud/appl/lib /"(因为这是Linux系统的路径而不是MacOs的路径),然后执行initMacPath(因为它匹配)并尝试为MacOs系统设置正确的路径(“${basedir}/../../. ./../../../../../usr/share/XCloud/appl/lib") 但它不能这样做,因为该属性只是设置并且不能更改! )

所以我有一个问题,因为在 MacOs 机器上,我将该路径值设置为错误的 Linux 路径(“/usr/share/XCloud/appl/lib/”),而不是正确的 MacOs 路径(“${basedir} /../../../../../../../../usr/share/XCloud/appl/lib")

我发现的唯一解决方案是将 init 目标中依赖项的顺序从:

<target name="init" depends="initUnixPath, initMacPath ">

至:

<target name="init" depends="initMacPath, initUnixPath ">

所以是Mac为MacOs系统设置了正确的路径,然后进入initUnixPath尝试设置Linux路径但是不行(在Mac上运行良好)

如果它是 Linux 系统,请尝试执行initMacPath但 Linux 不是 Mac,因此请退出此目标并执行initUnixPath正确设置 Linux 路径的位置(并且在 Linux 上运行良好)

但这在我看来是一个非常肮脏的解决方案!!!

所以我问我是否可以更准确地检测它是否是 LINUX 系统(而不是通用 UNIX 系统)。我可以做吗?

肿瘤坏死因子

安德烈亚

4

1 回答 1

1

我总是象征性地将我安装的二进制文件链接到/usr/local/bin. 这样,我不必担心它是否安装在/Applicationsor/opt/usr/share等中。如果您在该位置(通过任务)看不到可执行文件,请<available/>使用有关操作的说明使构建失败。

<property name="bin.link.dir"  value="/usr/local/bin"/>
<available file="${bin.link.dir}/xcloud" <!-- Or whatever the app -->
    property="xcloud.app.available"/>    <!-- Or whatever the app -->
<fail>
   Could not find required app...
   download it from yadda, yadda, yadda...
   Install it by blah, blah, blah...
   Then create a symbolic link to ${link.dir}...
   <condition>
      <not>
         <isset property="xcloud.app.available"/>
      </not>
   </condition>
</fail>

uname如果它是 Unix 类型系统,您也可以使用该命令来查看它是否是 Linux:

<!-- outputs "Darwin" on Mac and "Linux" on Linux -->
<exec executable="uname"
   os="unix"
   outputproperty="os.type"/>

<condition property="linux.os">
    <equals  arg1="${os.type}"  arg2="Linux"/>
</condition>
于 2013-10-21T19:07:50.243 回答