首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有子项目的Android Gradle构建

带有子项目的Android Gradle构建
EN

Stack Overflow用户
提问于 2013-06-07 04:16:18
回答 5查看 69.5K关注 0票数 56

我目前正在将我们的一个项目从maven转换为Gradle。文件夹结构如下:

代码语言:javascript
复制
gitRoot
    settings.gradle
    build.gradle
    ProjectA
        build.gradle
        src/main/java
    Libraries
        SomeLib (git submodule)
        ProjectBRoot (git submodule)
            settings.gradle
            build.gradle
            ProjectB
                build.gradle
                src/main/java
            Libraries
                FacebookSDK/facebook
                    build.gradle
                    src

所以它看起来已经很复杂了。但这个想法是,ProjectB是一个库项目,它应该能够单独构建和打包,这就是为什么它有自己的settings.gradle,据我所知,它似乎工作得很好,我已经构建了它,并找到了facebook。

项目B/build.gradle包含这一行

代码语言:javascript
复制
compile project(':libraries:facebook-android-sdk:facebook')

ProjectBRoot/settings.gradle包含以下行

代码语言:javascript
复制
include ':ProjectB', ':libraries:facebook-android-sdk:facebook'

gitRoot/settings.gradle包含以下行

代码语言:javascript
复制
include ':ProjectA', ':Libraries:ProjectBRoot:ProjectB'

项目A/build.gradle包含这一行

代码语言:javascript
复制
compile project(':Libraries:ProjectBRoot:ProjectB')

当我运行构建时,我得到这个错误

代码语言:javascript
复制
The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead.

FAILURE: Build failed with an exception.

* Where:
Build file '/gitRoot/Libraries/ProjectBRoot/ProjectB/build.gradle' line: 17

* What went wrong:
A problem occurred evaluating project ':Libraries:ProjectBRoot:ProjectB'.
> Project with path ':libraries:facebook-android-sdk:facebook' could not be found in project ':Libraries:ProjectBRoot:ProjectB'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 4.652 secs

所以我的猜测是facebook不在ProjectB...but的直接子文件夹中,当在ProjectBRoot中构建时,这个子文件夹无关紧要。这可能是因为我直接引用了ProjectB,而不是通过ProjectBRoot/gradle.build,但我试过了,它也不起作用。有没有人能帮帮我,我已经看过文档了,里面并没有提到拥有自己settings.gradle文件的多个项目,我想这就是困扰我的地方。

更新:

因此,我遵循了Xav的回答,现在我可以使用命令行进行构建,但不能使用android studio导入/构建。我知道问题仍然出在facebook项目上。我得到的错误是它无法配置ProjectB。

代码语言:javascript
复制
 Gradle: A problem occurred configuring project ':ProjectA'.
   > Failed to notify project evaluation listener.
     > A problem occurred configuring project ':Libraries:ProjectBRoot:ProjectB'.
       > Failed to notify project evaluation listener.
         > Configuration with name 'default' not found.

错误是由下面这行引起的

代码语言:javascript
复制
 compile project(':facebook-sdk')

深入项目B/build.gradle

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-07 08:28:54

settings.gradle必须定义所有模块。它不会加载树中找到的其他settings.gradle来加载更多的模块。

你必须要么

  1. 在顶层settings.gradle中为facebook SDK定义一个模块。是的,它与其他settings.gradle.
  2. publish项目B在某种程度上(以及它的依赖项,因此在本例中是facebook SDK库)是多余的,并且可以从项目A访问它。

虽然#1更好,但它使ProjectB -> Facebook依赖变得棘手,因为路径将根据所使用的settings.gradle而不同。解决此问题的一种方法是将模块名称/路径与其在磁盘上的实际位置分开。这是在settings.gradle文件中完成的。

在顶级settings.gradle文件中,执行以下操作

代码语言:javascript
复制
include 'facebook-sdk'
project(':facebook-sdk').projectDir = new File('Libraries/ProjectBRoot/Libraries/FacebookSDK/facebook')

在项目B中的setting.gradle文件中,对不同的相对路径执行相同的操作:

代码语言:javascript
复制
include 'facebook-sdk'
project(':facebook-sdk').projectDir = new File('Libraries/FacebookSDK/facebook')

这使得两个项目设置在磁盘上的相同绝对位置定义了相同的'facebook-sdk‘模块。

依赖于此模块的所有项目都应将依赖项声明为

代码语言:javascript
复制
compile project(':facebook-sdk') 
票数 96
EN

Stack Overflow用户

发布于 2013-06-07 22:30:25

这不是你想要的答案,但是...

我花了大约4天的时间尝试将我复杂的项目结构(实际上很像你的)迁移到gradle中。最后,我放弃了整个子项目的概念(因为在我的例子中,它根本不起作用),我选择使用本地maven存储库方法,如本文所述:http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds

因此,在具有子项目的库项目中,我基本上为每个子项目创建了完整的库项目,然后使用上面的链接将这些项目发布到maven本地存储库。然后在父项目中,我删除了对子项目的所有引用,而在依赖项中,我只引用了已发布的库。然后在我的主项目中,我删除了对子项目的所有引用,并引用了我的库的已发布的maven本地版本。

最后,这一切都工作得很好,但它确实需要一些时间来转换一切。我有大约6个库项目和子项目,那个子项目,等等,现在一切都很好。

我不喜欢Gradle和Maven这样的系统的一点是,他们真的希望你改变你的代码/项目的结构。因此,如果你正在迁移到Gradle而不是从Gradle开始,那么这个过程可能会非常令人沮丧。一旦你弄清楚了,下一次就容易多了。)

票数 6
EN

Stack Overflow用户

发布于 2013-06-07 09:53:24

我只需要将应用程序和所有的库放在同一个级别。您仍然可以基于build.gradle文件构建和打包每个库。我可能遗漏了一些东西,但是结构并不像build.gradle文件中的内容那么重要。你仍然可以让projectB依赖于Facebook,即使它们位于相同的文件夹级别。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16971375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档