使用 Ant

获取 Ant 任务

Kotlin 为 Ant 提供了三个任务:

  • kotlinc: 面向 JVM 的 Kotlin 编译器;
  • kotlin2js: 面向 JavaScript 的 Kotlin 编译器;
  • withKotlin: 使用标准 javac Ant 任务时编译 Kotlin 文件的任务。

这仨任务在 kotlin-ant.jar 库中定义,该库位于 Kotlin 编译器lib 文件夹中 需要 Ant 1.8.2+ 版本。

面向 JVM 只用 Kotlin 源代码

当项目由 Kotlin 专用源代码组成时,编译项目的最简单方法是使用 kotlinc 任务:

  1. <project name="Ant Task Test" default="build">
  2. <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>
  3. <target name="build">
  4. <kotlinc src="hello.kt" output="hello.jar"/>
  5. </target>
  6. </project>

其中 ${kotlin.lib} 指向解压缩 Kotlin 独立编译器所在文件夹。

面向 JVM 只用 Kotlin 源代码且多根

如果项目由多个源代码根组成,那么使用 src 作为元素来定义路径:

  1. <project name="Ant Task Test" default="build">
  2. <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>
  3. <target name="build">
  4. <kotlinc output="hello.jar">
  5. <src path="root1"/>
  6. <src path="root2"/>
  7. </kotlinc>
  8. </target>
  9. </project>

面向 JVM 使用 Kotlin 和 Java 源代码

如果项目由 Kotlin 和 Java 源代码组成,虽然可以使用 kotlinc 来避免任务参数的重复,但是建议使用 withKotlin 任务:

  1. <project name="Ant Task Test" default="build">
  2. <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>
  3. <target name="build">
  4. <delete dir="classes" failonerror="false"/>
  5. <mkdir dir="classes"/>
  6. <javac destdir="classes" includeAntRuntime="false" srcdir="src">
  7. <withKotlin/>
  8. </javac>
  9. <jar destfile="hello.jar">
  10. <fileset dir="classes"/>
  11. </jar>
  12. </target>
  13. </project>

还可以将正在编译的模块的名称指定为 moduleName 属性:

  1. <withKotlin moduleName="myModule"/>

面向 JavaScript 用单个源文件夹

  1. <project name="Ant Task Test" default="build">
  2. <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>
  3. <target name="build">
  4. <kotlin2js src="root1" output="out.js"/>
  5. </target>
  6. </project>

面向 JavaScript 用 Prefix、 PostFix 以及 sourcemap 选项

  1. <project name="Ant Task Test" default="build">
  2. <taskdef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>
  3. <target name="build">
  4. <kotlin2js src="root1" output="out.js" outputPrefix="prefix" outputPostfix="postfix" sourcemap="true"/>
  5. </target>
  6. </project>

面向 JavaScript 用单个源文件夹以及 metaInfo 选项

如果要将翻译结果作为 Kotlin/JavaScript 库分发,那么 metaInfo 选项会很有用。 如果 metaInfo 设置为 true,则在编译期间将创建具有二进制元数据的额外的 JS 文件。该文件应该与翻译结果一起分发:

  1. <project name="Ant Task Test" default="build">
  2. <typedef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>
  3. <target name="build">
  4. <!-- 会创建 out.meta.js,其中包含二进制元数据 -->
  5. <kotlin2js src="root1" output="out.js" metaInfo="true"/>
  6. </target>
  7. </project>

参考

元素和属性的完整列表如下:

kotlinc 和 kotlin2js 的公共属性

名称描述必需默认值
src要编译的 Kotlin 源文件或目录 
nowarn禁止所有编译警告false
noStdlib不要将 Kotlin 标准库包含进 classpathfalse
failOnError在编译期间检测到错误时,会导致构建失败true

kotlinc 属性

名称描述必需默认值
output目标目录或 .jar 文件名 
classpath编译类路径 
classpathref编译类路径引用 
includeRuntimeKotlin 运行时库是否包含在 jar 中,如果 output 是 .jar 文件的话true
moduleName编译的模块的名称目标(如果指定的话)或项目的名称

kotlin2js 属性

名称描述必需
output目标文件
librariesKotlin 库的路径
outputPrefix生成的 JavaScript 文件所用前缀
outputSuffix生成的 JavaScript 文件所用后缀
sourcemap是否要生成 sourcemap 文件
metaInfo是否要生成具有二进制描述符的元数据文件
main编译器是否生成调用 main 函数的代码

传递原始编译器参数

如需传递原始编译器参数,可以使用带 valueline 属性的 <compilerarg> 元素。 可以放在 <kotlinc><kotlin2js><withKotlin> 任务元素内,如下所示:

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

当运行 kotlinc -help 时,会显示可以使用的参数的完整列表。