我正在为我的 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
我想知道是否可以在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子项目?
感谢您提供有用的提示!
此问题类似于使一个源集依赖于另一个
除了主要的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中生成的类:(
看似与该问题相同的根本原因,但那里的答案对我不起作用。我有一个自定义的源集commonTest,用于在test和androidTest源集之间共享某些测试实用程序代码。这是我相关的项目配置:
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
我正在尝试将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
我的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动态创建源集.我当前项目的目录层次结构如下所示:
每个模块文件夹(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)