【问题标题】:Conditional dependencies条件依赖
【发布时间】:2014-01-24 02:04:44
【问题描述】:

在 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()

【问题讨论】:

  • 为什么你希望依赖是有条件的,在构建文件评估时解决?你能更详细地了解你想要做什么吗?必须有更好的解决方案。
  • 问“为什么?”当有人问“谁?”有点完全回避这个问题。我想知道如何煮豆子,而不是如果我有鹰嘴豆我能做什么;)但无论如何我已经更新了这个问题。

标签: java android gradle android-studio


【解决方案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
}

【讨论】:

  • 这很有希望!它仍然有效还是有更好的解决方案?距离您的回答已经快 2 年了。我不想为我的 Android 项目介绍 nightly jenkins build / naxeus。
【解决方案2】:

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

PS:这是allprojects,而不是allProjects

【讨论】:

  • 很棒的提议。我已经尝试过一些类似的东西。但是我遇到了我对我的问题发表评论的问题。
  • 您必须像 elastic-deps 一样考虑当前上下文。
猜你喜欢
  • 1970-01-01
  • 2014-08-06
  • 2021-05-29
  • 2019-09-18
  • 2020-06-21
  • 2014-06-10
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多