Kotlin使用Ant

獲取 Ant 任務

Kotlin 爲 Ant 提供了三個任務:

  • kotlinc: 針對 JVM 的 Kotlin 編譯器
  • kotlin2js: 針對 JavaScript 的 Kotlin 編譯器
  • withKotlin: 使用標準 javac Ant 任務時編譯 Kotlin 文件的任務

這仨任務在 kotlin-ant.jar 庫中定義,該庫位於 Kotlin 編譯器的 lib 文件夾中

針對 JVM 只用 Kotlin 源代碼

當項目由 Kotlin 專用源代碼組成時,編譯項目的最簡單方法是使用 kotlinc 任務

<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 獨立編譯器所在文件夾。

針對 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 來避免任務參數的重複,但是
建議使用 withKotlin 任務

<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>

要爲 <withKotlin> 指定額外的命令行參數,可以使用嵌套的 <compilerArg> 參數。
當運行 kotlinc -help 時,會顯示可以使用的參數的完整列表。
還可以將正在編譯的模塊的名稱指定爲 moduleName 屬性:

<withKotlin moduleName="myModule">
    <compilerarg value="-no-stdlib"/>
</withKotlin>

針對 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,則在編譯期間將創建具有
二進制元數據的額外的 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,其中包含二進制元數據 -->
        <kotlin2js src="root1" output="out.js" metaInfo="true"/>
    </target>
</project>

參考

元素和屬性的完整列表如下

kotlinc 和 kotlin2js 的公共屬性

名稱

描述

必需

默認值

src

要編譯的 Kotlin 源文件或目錄

是

nowarn

禁止所有編譯警告

否

false

noStdlib

不要將 Kotlin 標準庫包含進 classpath

否

false

failOnError

在編譯期間檢測到錯誤時,會導致構建失敗

否

true

kotlinc 屬性

名稱

描述

必需

默認值

output

目標目錄或 .jar 文件名

是

classpath

編譯類路徑

否

classpathref

編譯類路徑引用

否

includeRuntime

Kotlin 運行時庫是否包含在 jar 中,如果 output 是 .jar 文件的話

否

true

moduleName

編譯的模塊的名稱

否

目標(如果指定的話)或項目的名稱

kotlin2js 屬性

名稱

描述

必需

output

目標文件

是

libraries

Kotlin 庫的路徑

否

outputPrefix

生成的 JavaScript 文件所用前綴

否

outputSuffix

生成的 JavaScript 文件所用後綴

否

sourcemap

是否要生成 sourcemap 文件

否

metaInfo

是否要生成具有二進制描述符的元數據文件

否

main

編譯器是否生成調用 main 函數的代碼

否