标签: source-sets

在 Android Gradle 任务中获取已编译的 .class 输出目录

我正在为我的 Android 项目创建一个 Gradle 任务,该任务需要知道编译.class文件的路径。我怎样才能得到这条路?我找到了一些建议(这里这里;另请参阅Gradle 文档SourceSet),它们sourceSets.main.output.classDir会给我这条路径,但是当我尝试使用它时,出现错误

'output'在源集上找不到属性main

即使我创建一个新的、最小的项目,也会发生这种情况build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
}
apply plugin: 'android'
android {
    compileSdkVersion 22
    buildToolsVersion "20.0.0"

    task printClassesDir << {
        println sourceSets.main.output.classesDir
    }
}
Run Code Online (Sandbox Code Playgroud)

这个最小的项目构建得很好,但是如果我运行 task 会出现那个错误printClassesDir。如何.class在我的任务中获取文件输出目录?


我也试过的建议,<build variant>.javaCompile.classpath这个回答另一个问题。我能够访问这个属性

applicationVariants.find{it.name == 'debug'}.javaCompile.classpath
Run Code Online (Sandbox Code Playgroud)

但是这个文件集合是空的。


作为参考,这里是我的最小项目的其他文件:

src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="a.b">
  <uses-sdk
      android:minSdkVersion="9"
      android:targetSdkVersion="22" />
  <application> …
Run Code Online (Sandbox Code Playgroud)

android gradle source-sets build.gradle android-gradle-plugin

6
推荐指数
1
解决办法
3898
查看次数

为所有Java子项目定义源集

我想知道是否可以在gradle中定义一个源集(例如integrationTests),它可以应用于所有使用'java'插件的子项目?

就像是

sourceSets {
    integTest {
        java.srcDir file('src/integration-test/java')
        resources.srcDir file('src/integration-test/resources')
        compileClasspath = sourceSets.main.output + configurations.integTest
        runtimeClasspath = output + compileClasspath
    }
}
Run Code Online (Sandbox Code Playgroud)

这里提到的应用于所有java子项目?

感谢您提供有用的提示!

gradle source-sets

5
推荐指数
1
解决办法
3787
查看次数

Gradle sourceSet依赖于另一个sourceSet

此问题类似于使一个源集依赖于另一个

除了主要的SourceSet外,我还有一个testenv SourceSet。testenv SourceSet中的代码引用了主要代码,因此我需要将主要SourceSet添加到testenvCompile配置中。

sourceSets {
  testenv
}

dependencies {
  testenvCompile sourceSets.main
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为您不能直接将sourceSets添加为依赖项。推荐的方法是:

sourceSets {
  testenv
}

dependencies {
  testenvCompile sourceSets.main.output
}
Run Code Online (Sandbox Code Playgroud)

但这在eclipse上无法正常工作,因为当我清理gradle build文件夹时,eclipse无法再编译,因为它依赖于gradle build。另外,如果更改主代码,则必须重新构建项目以使更改在Eclipse中生效。

如何正确声明依赖关系?

编辑:

这个

sourceSets {
  testenv
}

dependencies {
  testenvCompile files(sourceSets.testenv.java.srcDirs, sourceSets.testenv.resources.srcDirs)
}
Run Code Online (Sandbox Code Playgroud)

适用于主要来源,但是因为我现在引用.java文件,所以我缺少了Annotation-Processor中生成的类:(

dependencies gradle source-sets

5
推荐指数
1
解决办法
1855
查看次数

Android Gradle插件无法识别SourceSet'commonTest'。也许您拼错了什么?

看似与该问题相同的根本原因,但那里的答案对我不起作用。我有一个自定义的源集commonTest,用于在testandroidTest源集之间共享某些测试实用程序代码。这是我相关的项目配置:

sourceSets {
    // This lets us write test utility code that can be used by both unit tests and android tests
    commonTest {
        java
    }
    test {
        java.srcDirs += commonTest.java.srcDirs
    }
    androidTest {
        java.srcDirs += commonTest.java.srcDirs
    }
}
Run Code Online (Sandbox Code Playgroud)

这在AGP 3.0.1上可以正常使用,但在AGP 3.1.0上无法使用。不再支持自定义源集吗?

android source-sets android-gradle-plugin android-sourcesets

5
推荐指数
1
解决办法
3607
查看次数

为 android 中的每种风格替换 XML 文件

我正在尝试将Braze集成到我的应用程序中以进行推送通知。Braze 需要我们在其中添加 API 密钥和其他 braze 相关内容(这里是文档)创建一个braze.xml文件。src/main/res/values

现在我需要区分 prod 和 qa 环境,这意味着它们将有 2 个不同的 API 密钥。

我想知道如何使用不同的braze.xml口味来实现不同的效果。

我找到了这个

sourceSets {
    main {
         java {
            srcDirs = ['src']
         }
    }

    test {
        java {
            srcDirs = ['test']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何使用它来替换我的 braze.xml 以适应不同的构建变体。

android source-sets build.gradle android-gradle-plugin android-variants

5
推荐指数
1
解决办法
914
查看次数

gradle sourceSets on mutli-project

我的gradle多项目布局是这样的:

rootProject
  |-- project1
  |
  |-- project2
  |
  |-- src
  |    |-- main
  |    |    |-- groovy
  |    |    `-- resources
  |    |-- test
  |    |    |-- groovy
  |    |    `-- resources
  |    `-- sanity
  |         |-- groovy
  |         `-- resources
  |
  |---- settings.gradle
  `---- build.gradle
Run Code Online (Sandbox Code Playgroud)

project1和project2在build.gradle中配置(在rootProject中).
我想将project1和project2 testClassDir更改为完整性.

我的build.gradle是这样的:

subprojects{
    apply plugin: "groovy"

    sourceSets {
        sanity {
           groovy.srcDir "src/sanity/groovy"
           resources.srcDir "src/sanity/resources"
        }
    }

    dependencies {
        sanityCompile sourceSets.main.output
        sanityCompile sourceSets.test.output

        sanityCompile configurations.compile
        sanityCompile configurations.testCompile

        sanityRuntime …
Run Code Online (Sandbox Code Playgroud)

gradle source-sets

3
推荐指数
1
解决办法
1521
查看次数

是否可以动态创建源集?

我想知道是否可以使用gradle动态创建源集.我当前项目的目录层次结构如下所示:

  • dbfit-的JUnit
      • FOO
      • 酒吧

每个模块文件夹(foo和bar)都应分配自己的源集.原因是我想动态创建dbFitTestFoo和dbFitTestBar等任务.我目前的方法如下:

ext.dbFitModulesDir = "dbfit-junit/module"
ext.dbFitTestSpecs = ["java", "groovy", "scala", "resources"]  
ext.dbFitModules = []

file(dbFitModulesDir).eachDir{ module ->
    dbFitModules << module.name
}

/** this needs to be done dynamically for each "module" **/
sourceSets {
    integrationTest { sourceSet ->
        dbFitModules.each{ module ->
            dbFitTestSpecs.each { spec ->
                if (!sourceSet.hasProperty(spec)) {
                    return
                }
                sourceSet."$spec".srcDir file("$dbFitModulesDir/$module/$spec")
            }
        }
    }
}

dbFitModules.each{ module ->
    task "dbFitTest${module.capitalize()}"(type: Test) {
        group = "Verification"
        description = "Run dbFit tests for $module"
        doLast {
            testClassesDir …
Run Code Online (Sandbox Code Playgroud)

gradle source-sets

2
推荐指数
1
解决办法
1235
查看次数