条件依赖

时间:2014-01-24 02:04:45

标签: java android gradle android-studio

在Gradle上(更具体地说是在Android上)我如何才能获得条件依赖,以便从父项目中加载它们,如下所示:

compile project(':lib') 

或来自存储库的父项目中不存在:

compile 'com.sample:lib:+'

我想到的一个可能的解决方案是:

compile allprojects.find({ it.name.equal('lib')}) != null  ? project(':lib') : 'com.sample:lib:+'

但是依赖项任务中没有allProjects属性。

更新

我正在搜索这个的原因是因为我们有两个设置,一个是从开发机器上的不同git存储库导入我们的子项目,另一个是从我们的依赖关系服务器导入CI的依赖项。

我尝试过的另一种方法是在父项目中设置它:

ext.projectNames = allprojects.collect{ it.name }

在子项目中我正在这样做:

compile projectNames.contains('lib') ? project(':lib') : 'com.sample:lib:+'

这样可行,但是因为在当前设置中我们只运行CI服务器中的一个子项目,此属性将不存在并且将失败,因此可能必须将此行为提取到插件并且可能使用getParent()

2 个答案:

答案 0 :(得分:1)

动态解析项目依赖项或外部依赖项还不是一流的Gradle功能,并且需要花费一些精力(并且可能会产生一些限制)才能在构建中实现它。您可以在此处找到概念验证:https://github.com/pniederw/elastic-deps

PS:它是allprojects,而不是allProjects

答案 1 :(得分:1)

我需要相同的功能。让它与gradle一起工作很简单。困难的部分是弄清楚Android Studio如何同步gradle文件。如果没有成功同步,IDE将抱怨它找不到任何依赖项。无论如何,我想通了,这是我使用gradle和Android Studio的解决方案。

https://gist.github.com/vangorra/c1383c355ce8fe56adf8

它基本上归结为在settings.gradle中定义项目:

include 'library'
project(':library').projectDir = file('../Library/library')

然后你必须为你的依赖使用带有选项闭包的单行代码:

compile ( project(':library').projectDir.exists() ? project(':library'): 'Library:library:unspecified@aar') {
    transitive = true
}