【问题标题】:what is aptMode of kapt used for?kapt 的 aptMode 是做什么用的?
【发布时间】:2020-01-30 09:57:20
【问题描述】:

doc 中,aptMode 有三个值。

有没有关于这些值的详细信息?

“存根”是什么意思?

【问题讨论】:

    标签: kotlin annotation-processing kapt


    【解决方案1】:

    参见https://blog.jetbrains.com/kotlin/2015/06/better-annotation-processing-supporting-stubs-in-kapt/(存根在第二段中描述,但第一段提供上下文):

    kapt 的初始版本通过拦截注释处理器(例如 Dagger 2)和 javac 之间的通信来工作,并在 javac 在源代码中看到的 Java 类之上添加了已经编译的 Kotlin 类。这种方法的问题在于,由于 Kotlin 类必须已经编译,它们无法引用处理器生成的任何代码(例如 Dagger 的模块类)。因此我们不得不用 Java 编写 Dagger 应用程序类。

    正如上一篇博文中所讨论的,可以通过在运行 javac 之前生成 Kotlin 类的存根,然后在 javac 完成后运行真正的编译来解决这个问题。存根只包含声明,不包含方法体。 Kotlin 编译器过去常常在内存中创建此类存根(它们用于 Java 互操作,当 Java 代码引用 Kotlin 时),所以我们所要做的就是将它们序列化为磁盘上的文件。

    还有this answer

    但现在默认生成存根,您可以使用aptMode=apt 显式禁用此生成或使用aptMode=stubs 生成存根。我认为它们主要供构建系统(例如 Gradle)在内部使用,如 https://www.bountysource.com/issues/38443087-support-for-kapt-for-improved-kotlin-support 中所述:

    有 4 个步骤。

    1. kaptGenerateStubsKotlin: 使用插件运行 kotlinc:org.jetbrains.kotlin.kapt3:aptMode=stubs
    2. kaptKotlin 使用插件运行 kotlinc:org.jetbrains.kotlin.kapt3:aptMode=apt
    3. 编译Kotlin 定期运行 kotlinc
    4. 编译Java 使用 -proc:none 运行 javac 并传递步骤 2 中生成的源代码。

    这些步骤与每个小版本的 kotlin 略有不同,所以这会很有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2023-04-03
      • 2014-03-04
      • 2012-05-19
      • 2011-10-25
      • 2015-07-17
      相关资源
      最近更新 更多