什么是适当的Gradle项目结构,用于在“项目”和“外部”依赖项之间切换

时间:2016-02-21 10:46:03

标签: java android maven gradle

我有一小组图书馆和应用程序:

  • forge-base - java项目(Intellij IDEA项目)
  • forge-android - android库项目,取决于forge-base(AS项目)
  • forge-android-skeleton - 示例Android应用,取决于forge-android(AS项目)

在初始开发期间,我使用了具有项目依赖性的结构,如:

settings.gradle:

...

include ':forge-base'
project(':forge-base').projectDir=new File("$settingsDir/../forge/base")

...

然后在build.gradle中:

compile project(':forge-base')

这就像一个魅力,但后来我需要在maven repo上发布libs,并且必须改变依赖关系:

的build.gradle:

compile 'com.bolyartech.forge:forge-base:2.0-SNAPSHOT'

我现在面临的问题是我试图在所有3个项目中进行一些重大的重构,我需要旧的deps结构,以便轻松确认项目的一致性,例如:仅构建skeleton应用程序,并自动进行所有递归重新编译/构建(就像使用compile project(':forge-base')引用lib项目时那样)。如果我使用'new'结构发布到(本地)maven,我必须每次都发布lib(增加版本)我在其中更改一些内容,以便其他两个项目可以看到更改。

通常/规范为什么要处理这样的情况?

是否有一种简单的方法可以在两种“模式”之间切换,例如'内部'/'外部'依赖?

1 个答案:

答案 0 :(得分:1)

事实证明这很容易做到。您可以对不同的构建类型使用不同的依赖项,例如调试/发布,例如对于我的forge-android-skeleton项目,我现在有以下内容:

settings.gradle中的

include ':app'

include ':forge-base' project(':forge-base').projectDir=new
File("$settingsDir/../../../forge/base")

include ':forge-android' project(':forge-android').projectDir=new
File("$settingsDir/../../../forge-android/forge-android")
app/build.gradle中的

...
releaseCompile ('com.bolyartech.forge:forge-android:2.7-SNAPSHOT')

debugCompile project(':forge-android')
...

请注意,在settings.gradle中,您需要将所有依赖项都放回到底部,否则它将无效(这就是forge-base定义的原因,即使没有明确使用)。

您还可以定义另一种构建类型,例如direct-deps,并在您不想使用调试/发布类型时使用它。

请注意,如果您为某些项目(例如我的IDEA和AS)使用不同的IDE,可能最好确保两者都使用相同(版本)gradle,否则可能会出现意外问题