在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()
答案 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
}