使用ant来检测os和设置属性

时间:2009-01-17 11:29:31

标签: ant

我想通过os类型以不同方式设置ant任务中的属性。

该属性是一个目录,在windows中我希望它在unix / linux“/ opt / flag”中为“c:\ flag”。

我的当前脚本仅在我使用默认目标运行时才有效,但为什么?  

    <target name="checksw_path" depends="if_windows, if_unix"/>

<target name="checkos">
    <condition property="isWindows">
        <os family="windows" />
    </condition>

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

<target name="if_windows" depends="checkos" if="isWindows">
   <property name="sw.root" value="c:\flag" />
    <echo message="${sw.root}"/>
</target>

<target name="if_unix" depends="checkos" if="isLinux">
    <property name="sw.root" value="/opt/flag" />
    <echo message="${sw.root}"/>
</target>

在我的所有蚂蚁目标中,我添加了“depends = checksw_path”。

如果我在Windows中运行默认目标我已经正确地“c:\ flag”但是如果我运行非默认目标我已经得到了调试进入if_windows但是指令“”没有设置保留/ opt / flag的财产。我正在使用ant 1.7.1。

8 个答案:

答案 0 :(得分:23)

将您的条件移出<target />,因为您的目标可能未被调用。

 <condition property="isWindows">
                    <os family="windows" />
 </condition>

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

答案 1 :(得分:12)

您需要为属性设置值“true”才能使if条件生效。请参阅以下代码:

<target name="checkos">
    <condition property="isWindows" value="true">
            <os family="windows" />
    </condition>

    <condition property="isLinux" value="true">
            <os family="unix" />
    </condition>
</target>

HTH, 哈

答案 2 :(得分:6)

我使用过这个脚本,对我来说效果很好:

<project name="dir" basedir=".">

  <condition property="isWindows">
    <os family="windows" />
  </condition>

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

  <target name="setWindowsRoot" if="isWindows">
    <property name="root.dir" value="c:\tmp\" />
  </target>

  <target name="setUnixRoot" if="isUnix">
    <property name="root.dir" value="/i0/" />
  </target>

  <target name="test" depends="setWindowsRoot, setUnixRoot">
    <mkdir dir="${root.dir}" />
  </target>

</project>

答案 3 :(得分:5)

如果您想根据操作系统设置该单一属性,您也可以直接设置它,而无需创建任务:

class CenterScaleToFitImageView: UIImageView {
    override var bounds: CGRect {
        didSet {
            adjustContentMode()
        }
    }

    override var image: UIImage? {
        didSet {
            adjustContentMode()
        }
    }

    func adjustContentMode() {
        guard let image = image else {
            return
        }
        if image.size.width > bounds.size.width ||
            image.size.height > bounds.size.height {
            contentMode = .ScaleAspectFit
        } else {
            contentMode = .Center
        }
    }
}

答案 4 :(得分:1)

尝试在java任务中设置<sysproperty key="foobar" value="fowl"/>。 然后,在您的应用程序中,使用System.getProperty(“foobar”);

答案 5 :(得分:0)

首先,您要根据操作系统(OS)将变量设置为true或false:

<condition property="IS_WINDOWS" value="true" else="false">
   <os family="windows"/>
</condition> 

然后你想用变量触发你的逻辑。为此你可以在这里找到答案:

http://boulderapps.co/running-different-ant-tasks-depending-on-the-operating-system

答案 6 :(得分:0)

通过使用Ant Contrib,您可以通过减少为了添加这些条件而需要声明的元素数量来简化构建文件。

<!--Tell Ant to define the Ant Contrib tasks from the jar-->
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
        <pathelement location="path/to/ant-contrib-0.6.jar"/>
    </classpath>
</taskdef>

<!--Do your OS specific stuff-->
<target name="checkos">
    <if>
        <os family="unix"/>
        <then>
            <!--Do your Unix stuff-->
        </then>
        <elseif>
            <os family="windows"/>
            <then>
                <!--Do your Windows stuff-->
            </then>
        </elseif>
    </if>
</target>

答案 7 :(得分:-2)

我使用-Dsw.root = c:\ flag(对于windows)或-Dsw.root = / opt / superwaba(对于linux)解决了使用sw.root的值执行ant任务。

无论如何,谢谢