【发布时间】:2015-05-03 17:24:00
【问题描述】:
我在设置多模块项目时遇到了一系列 gradle 问题。我正在尝试制作一个包含 SDK 的 AAR,供我们的客户使用。我还在尝试生成一个示例应用程序,该应用程序将该 AAR 用作内部开发平台,并作为我们的客户如何使用该平台的示例。
settings.gradle:
include :sdk
include :SampleApplication
build.gradle:
...
// copy the AAR produced by the SDK into the SampleApplication
task import_aar(type: Copy) {
dependsOn ":sdk:build"
from(new File(project(':sdk').getBuildDir(), 'outputs/aar')) {
include '*-release.aar'
rename '(.*)-release.aar', '$1-v1.0.0.aar'
}
into new File(project(':SampleApplication').projectDir, 'aars')
}
...
SampleApplication/build.gradle:
...
repositories {
...
flatDir {
dirs 'aars'
}
}
...
dependencies {
...
// This causes gradle to fail if the AAR hasn't been copied yet
compile 'com.moxiesoft.netagent:moxieMobileSDK:+@aar'
compile project(':moxieMobileSDK')
...
}
所以我现在遇到的最大问题是让import_aar 任务在compileDebug/ReleaseSources 任务之前运行。我尝试向编译任务添加显式依赖项,但显然我没有找到正确的方法。
我已尝试将其放入 SampleApplication/settings.gradle:
tasks['compileReleaseSources'].dependsOn(':import_aar')
但是 gradle 失败了,因为没有 compileReleaseSources 任务,即使 gradle :SampleApplication:tasks 显示了一个。
我也尝试将类似的东西放在 settings.gradle 中,但它也失败了,错误是任务 compileReleaseSources 不存在。
将其放入我的 SampleApplication/settings.gradle 确实取得了有限的成功:
tasks['build'].dependsOn(':import_aar')
但这只有在我使用“gradle build”时才会产生正确的影响,如果我在 Android Studio 中调试或运行,则不会发生这种情况。
我终于能够通过将 dependsOn 放在 preBuild 任务上来实现它,但我仍然对解决方案不是特别满意,因为:
它要求我在 gradle 运行之前将 aar 安装到位,这 意味着我最终将 .aar 放入 git,这不是 特别好主意。
我不希望 AAR 生成泄漏到 SampleApplication/build.gradle 文件,因为它是为 客户使用情况。
一般来说有没有更好的方法来处理这个问题?
【问题讨论】:
-
我不知道“更好”,但这是我为我的 CWAC 库所做的,它们具有类似的库和演示设置。我有
debug演示应用程序构建只是指向库模块(例如,debugCompile project(':lib'))。我使用maven插件将我的 AAR 发布到我的 Maven 存储库(在我的情况下是一个附加脚本,因为我的存储库位于 Amazon S3 上)。然后,我的演示应用程序使用releaseCompile从存储库中提取工件,以确认我可以针对 AAR 进行构建。我的方法可能需要一些修饰,但它可以完成工作。
标签: android android-studio gradle aar