Gradle中的相对项目依赖项?

时间:2012-03-16 21:24:50

标签: gradle

指定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')
}

6 个答案:

答案 0 :(得分:38)

对于Android Studio和gradle下的Android开发,以下是如何编译不在项目根目录下但具有相对路径的库:

  1. 在settings.gradle中包含库并覆盖projectDir:

    include 'MyTestLibProject:MyTestLib'
    project(':MyTestLibProject:MyTestLib').projectDir = new File(settingsDir, '../MyTestLibProject/MyTestLib')
    
  2. 编辑库的build.gradle以使用android-library插件而不是android,这会导致库输出包含在引用它的项目中:

    apply plugin: 'android-library'
    
  3. 通过编辑非lib项目的build.gradle,指定项目对lib具有依赖性:

    compile project(path: ':MyTestLibProject:MyTestLib')
    
  4. 如果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')
    }
    
  5. 免责声明:这不是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"))