指定Gradle项目依赖项时,我可以避免使用完整的绝对项目名称而使用相对项目吗? (即在我的例子中,我不想明确指定:app-a引用时:domain-a)
//Directory structure
app-a/
domain-a/
build.gradle
webapp-a/
build.gradle
WebApp-A build.gradle:
apply plugin: 'java'
//Build.gradle for webapp-a
dependencies {
// Works
compile project(':app-a:domain-a')
//Doesn't work
compile project(projectDir.path + '/../domain-a/')
//Doesn't work
compile findProject('../domain-a')
//Doesn't work
compile project(':domain-a')
}
答案 0 :(得分:38)
对于Android Studio和gradle下的Android开发,以下是如何编译不在项目根目录下但具有相对路径的库:
在settings.gradle中包含库并覆盖projectDir:
include 'MyTestLibProject:MyTestLib'
project(':MyTestLibProject:MyTestLib').projectDir = new File(settingsDir, '../MyTestLibProject/MyTestLib')
编辑库的build.gradle以使用android-library插件而不是android,这会导致库输出包含在引用它的项目中:
apply plugin: 'android-library'
通过编辑非lib项目的build.gradle,指定项目对lib具有依赖性:
compile project(path: ':MyTestLibProject:MyTestLib')
如果lib包含项目还包含的任何jar,则构建将在生成apk时将它们视为冲突。抽象jar到项目和lib引用的附加lib中,或者只是从主项目中排除碰撞jar并让它从依赖项中获取jar:
dependencies {
compile fileTree(dir: 'libs', include: '*.jar', exclude: '**/android-support-v4.jar')
compile project(path: ':MyTestLibProject:MyTestLib')
}
免责声明:这不是gradle希望你这样做的方式 - 你打算使用maven发布lib,然后使用已发布的lib的“POM”(包括版本号)引用依赖关系。这提供了更好的依赖关系管理 - 例如,maven简化了使用各种版本的公共库的许多项目(具有不同的发布周期)的场景。这里描述的相对路径技术是一个快速启动和运行小项目的方法,或者作为从ant移植的项目的临时步骤。
参考:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Creating-a-Library-Project
答案 1 :(得分:8)
尽管使用相对路径可能是一种不好的做法,但有时您可能只需要这样做。 不过,以下是如何让它发挥作用。
您需要在webapp-a
中创建settings.gradle
文件
web应用-A / settings.gradle
include '..:domain-a'
然后在webapp-a / build.gradle
中compile project(':..:domain-a')
(我自己没有测试过,但它应该有效)
编辑:
在两个文件中将../domain-a
替换为..:domain-a
答案 2 :(得分:2)
相对名称是一个坏主意,因为它们使您的项目依赖于它所在的更广泛的项目。但情况并非如此。我建议避免使用相对名称。
在检索父项目作为依赖项方面,这将通过默认为父目录来完成,或者失败它将使用通常的依赖项解析机制,它使用坐标(groupId,artifactId和version)并查看工件在本地存储库中..
答案 3 :(得分:0)
迟到的回答永远不会伤害。我的解决方案接近于@lihsus所建议的。
假设您有以下项目结构:
//Directory structure
app-a/
domain-a/
build.gradle
webapp-a/
build.gradle
确保 app-a 包含 build.gradle 和 settings.gradle 。
在 app-a 的 settings.gradle 中,您可以包含两个模块/项目,例如:
include ':domain-a'
include ':webapp-a'
然后在 webapp-a 中,您可以将 domain-a 添加为编译依赖项,如您所建议的那样:
compile project(':domain-a')
答案 4 :(得分:0)
使用编译项目':'。 不需要其他任何东西。现在你的使用' project将在您的文件系统/ Eclipse / IntelliJ上使用此共享项目。
答案 5 :(得分:0)
我刚刚检查了 Gradle 培训并询问了相对路径,我得到的答案是最佳实践是方法 file("...") 方便的相对路径。 您可以查看 documentation .
我还没有测试过,但我想这会奏效:
compile findProject(file("domain-a"))