看起来ANT的<condition>
可以测试操作系统的名称、家族和版本:
根据该链接,我们可以查询与操作系统相关的一些属性。其中一个是常用代码中使用的普通family
属性:
<!-- CHECK FOR WINDOWS FAMILY OS -->
<condition property="is_windows">
<os family="windows"/>
</condition>
我的ANT版本没有打印出
${os.family}
的解析值。
还有:
- os.name <--- 这是你需要检查的
- os.arch
- os.version
这是我制作的一个演示脚本,用于展示这些属性的使用方法:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Test" default="build" >
<condition property="is_windows">
<os family="windows"/>
</condition>
<condition property="is_windows_7">
<os name="Windows 7"/>
</condition>
<target name="display_windows" if="is_windows" >
<echo message="OS Family is: Windows" />
</target>
<target name="build" >
<antcall target="display_windows" />
<echo message="OS Name is: ${os.name}" />
<echo message="OS Architecture is: ${os.arch}" />
<echo message="OS Version is: ${os.version}" />
</target>
</project>
自回答此问题以来,上述代码已被提升为我们的生产构建系统,在其中为Windows和Mac提供共享功能。
@thekbb提出了一个好建议,可以删除<antcall target="display_windows" />
,并根据以下代码更新目标定义以依赖于display_windows
:
<target name="build" depends="display_windows">
<echo message="OS Name is: ${os.name}" />
<echo message="OS Architecture is: ${os.arch}" />
<echo message="OS Version is: ${os.version}" />
</target>
这是因为
antcall
会在新的 JVM 中启动一个新的 ant 实例。一些用户可能会觉得这种优化更易于理解;而另一些用户可能出于性能原因而想要这样做。