【问题标题】:apt dependency scope in Android gradle - what is it used for?Android gradle 中的 apt 依赖范围 - 它的用途是什么?
【发布时间】:2016-05-03 04:17:27
【问题描述】:

我有时看到的 android gradle 文件中的 apt 依赖范围是什么?

一个例子看起来像这样?

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'
    defaultConfig {
        applicationId "org.ligboy.test.card.module1"
        minSdkVersion 14
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

final DAGGER_VERSION = '2.0.2'

dependencies {  
    compile "com.google.dagger:dagger:${DAGGER_VERSION}"
    apt "com.google.dagger:dagger-compiler:${DAGGER_VERSION}"//what is this scope 
    provided 'org.glassfish:javax.annotation:10.0-b28'
}

在顶层 build.gradle 文件中,它有这个全局依赖:

buildscript { 
dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }
}

注意依赖部分有一个合​​适的范围?我只知道编译、打包和提供的范围。编译 在编译时和包中包含依赖项,前提是只在编译时包含库并在 打包时间,因此它不包含在最终构建中。而包是相反的,它包含包中的依赖项,而不是在编译时。 但是什么是 apt 依赖范围,我们显然需要 com.neenbedankt.android-apt 才能工作,所以我知道它是基于 android 的。

更新: 为什么我不能使用 provided 依赖范围而不是 apt 范围?它们有何不同?

我在dagger dependency scopes 上为需要更多信息的人创建了一个教程。

【问题讨论】:

    标签: android gradle android-gradle-plugin


    【解决方案1】:

    只是添加如何在 Studio 2.2 + 中更改它

    dependencies {
        compile 'com.google.dagger:dagger:2.4'
        annotationProcessor "com.google.dagger:dagger-compiler:2.4"
    }
    

    在应用程序的 gradle 模块中添加这个。无需更改任何其他内容。

    编码愉快:)

    【讨论】:

      【解决方案2】:

      来自android-apt project page:

      android-apt 插件有助于结合 Android Studio 使用注释处理器。它有两个目的:

      • 允许将仅编译时的注释处理器配置为依赖项,不包括最终 APK 或库中的工件

      • 设置源路径,以便 Android Studio 正确拾取从注释处理器生成的代码。

      您正在使用 Dagger,它使用注释处理来生成代码。注释处理代码不应包含在最终 APK 中,并且您希望生成的代码对 Android Studio 可见。 android-apt 启用此行为。

      这听起来与provided 范围非常相似,但apt 与provided 在几个关键方面不同。第一个区别是 apt 依赖生成的代码可用于 IDE,而 provided 依赖生成的代码不可用。

      另一个重要的区别是库中使用 provided 范围的代码位于 IDE 类路径中(即您可以导入类并尝试使用它们),而 apt 依赖项中的代码不在。使用provided,如果您实际上没有为引用的依赖项提供compile 作用域对应项,那么您的代码将在运行时崩溃。

      您可以在 this android-apt issue 上找到有关 apt 与 provided 的讨论。

      对于 Dagger,没有理由在您的任何代码中包含注释处理器和代码生成器(provided 范围允许)。因此apt 范围更合适。

      2016 年 10 月更新: 你可能不再需要apt 和android-apt 插件了。 Android Gradle 插件 2.2 版有一个 annotationProcessor 配置,您应该改用它。

      在What's next for android-apt?查看更多信息

      【讨论】:

      • 为什么我不能在这种情况下使用“提供”而不是 apt ?我想如果你回答,这会为我解决问题。
      • 添加了对差异的解释。
      • 太棒了。我还在 gradle 中使用提供的 'org.glassfish:javax.annotation:10.0-b28' 。你认为把它变成一个合适的范围会更好吗?这样,任何生成器都不会包含在代码中,对吧?
      • 你当然可以试试。但是,如果该依赖项实际上在运行时使用(例如通过反射)并且由另一个依赖项提供,则您的应用可能会崩溃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多