Edit Page

Ant

最终更新: 2024/03/21

安装 Ant Task

Kotlin 提供了 3 个 Ant Task:

  • kotlinc: 面向 JVM 的 Kotlin 编译器
  • kotlin2js: 面向 JavaScript 的 Kotlin 编译器
  • withKotlin: 使用标准的 javac Ant Task 来编译 Kotlin 代码

这些 Task 定义在 kotlin-ant.jar 库文件内, 这个库文件位于 Kotlin 编译器lib 文件夹内. 需要的 Ant 版本是 1.8.2 以上.

面向 JVM, 编译纯 Kotlin 代码

如果工程内只包含 Kotlin 源代码, 这种情况下最简单的编译方法是使用 kotlinc Task:

<project name="Ant Task Test" default="build">
    <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>

    <target name="build">
        <kotlinc src="hello.kt" output="hello.jar"/>
    </target>
</project>

这里的 ${kotlin.lib} 指向 Kotlin standalone 编译器解压缩后的文件夹.

面向 JVM, 编译包含多个根目录的纯 Kotlin 代码

如果工程中包含多个源代码根目录, 可以使用 src 元素来定义源代码路径:

<project name="Ant Task Test" default="build">
    <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>

    <target name="build">
        <kotlinc output="hello.jar">
            <src path="root1"/>
            <src path="root2"/>
        </kotlinc>
    </target>
</project>

面向 JVM, 编译 Kotlin 和 Java 的混合代码

如果工程包含 Kotlin 和 Java 的混合代码, 这时尽管也能够使用 kotlinc, 但为了避免重复指定 Task 参数, 推荐使用 withKotlin Task:

<project name="Ant Task Test" default="build">
    <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>

    <target name="build">
        <delete dir="classes" failonerror="false"/>
        <mkdir dir="classes"/>
        <javac destdir="classes" includeAntRuntime="false" srcdir="src">
            <withKotlin/>
        </javac>
        <jar destfile="hello.jar">
            <fileset dir="classes"/>
        </jar>
    </target>
</project>

还可以通过 moduleName 属性来指定被编译的模块名称:

<withKotlin moduleName="myModule"/>

面向 JavaScript, 编译单个源代码文件夹

<project name="Ant Task Test" default="build">
    <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>

    <target name="build">
        <kotlin2js src="root1" output="out.js"/>
    </target>
</project>

面向 JavaScript, 使用 Prefix, PostFix 和 sourcemap 选项

<project name="Ant Task Test" default="build">
    <taskdef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>

    <target name="build">
        <kotlin2js src="root1" output="out.js" outputPrefix="prefix" outputPostfix="postfix" sourcemap="true"/>
    </target>
</project>

面向 JavaScript, 编译单个源代码文件夹, 使用 metaInfo 选项

如果你希望将编译结果当作一个 Kotlin/JavaScript 库发布, 可以使用 metaInfo 选项. 如果 metaInfo 设值为 true, 那么编译时会额外创建带二进制元数据(binary metadata)的 JS 文件. 这个文件需要与编译结果一起发布:

<project name="Ant Task Test" default="build">
    <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>

    <target name="build">
        <!-- 会创建 out.meta.js 文件, 其中包含二进制元数据(binary metadata) -->
        <kotlin2js src="root1" output="out.js" metaInfo="true"/>
    </target>
</project>

参照

完整的 Ant Task 元素和属性一览表如下:

kotlinc 和 kotlin2js 的共通属性

名称 说明 是否必须 默认值
src 需要编译的 Kotlin 源代码文件或源代码目录  
nowarn 屏蔽编译时的警告信息 false
noStdlib 不要将 Kotlin 标准库包含在 classpath 内 false
failOnError 如果编译过程中检测到错误, 是否让整个构建过程失败 true

kotlinc 独有的属性

名称 说明 是否必须 默认值
output 编译输出的目标目录, 或目标 .jar 文件名  
classpath 编译时的 class path 值  
classpathref 编译时的 class path 参照  
includeRuntime output 是 .jar 文件时, 是否将 Kotlin 运行库包含在这个 jar 内 true
moduleName 被编译的模块名称 编译目标的名称(如果有指定), 或工程名称

kotlin2js 独有的属性

名称 说明 是否必须
output 编译输出的目标文件
libraries Kotlin 库文件路径 No
outputPrefix 生成 JavaScript 文件时使用的前缀
outputSuffix 生成 JavaScript 文件时使用的后缀
sourcemap 是否生成 sourcemap 文件
metaInfo 是否生成带二进制描述符(binary descriptor)的元数据(metadata)文件
main 编译器是否生成对 main 函数的调用代码

指定编译参数

如果需要指定自定义的编译参数, 可以使用 <compilerarg> 元素的 valueline 属性. 这个元素可以放在 <kotlinc>, <kotlin2js>, 以及 <withKotlin> 任务元素之内, 示例如下:

<kotlinc src="${test.data}/hello.kt" output="${temp}/hello.jar">
    <compilerarg value="-Xno-inline"/>
    <compilerarg line="-Xno-call-assertions -Xno-param-assertions"/>
    <compilerarg value="-Xno-optimize"/>
</kotlinc>

运行 kotlinc -help 命令, 可以看到参数的完整列表.