Sto*_*yan 54 android gradle facebook-android-sdk
我目前正在将我们的一个项目从maven转换为Gradle.文件夹结构如下:
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
Run Code Online (Sandbox Code Playgroud)
所以看起来已经很复杂了.但是这个想法是ProjectB是一个图书馆项目,它应该能够单独构建和打包,这就是为什么它有自己的settings.gradle,据我所知它似乎工作正常,我有它建设并且它发现facebook就好了.
ProjectB/build.gradle包含此行
compile project(':libraries:facebook-android-sdk:facebook')
Run Code Online (Sandbox Code Playgroud)
ProjectBRoot/settings.gradle包含此行
include ':ProjectB', ':libraries:facebook-android-sdk:facebook'
Run Code Online (Sandbox Code Playgroud)
gitRoot/settings.gradle包含此行
include ':ProjectA', ':Libraries:ProjectBRoot:ProjectB'
Run Code Online (Sandbox Code Playgroud)
ProjectA/build.gradle包含此行
compile project(':Libraries:ProjectBRoot:ProjectB')
Run Code Online (Sandbox Code Playgroud)
当我运行构建时,我收到此错误
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
Run Code Online (Sandbox Code Playgroud)
所以我的猜测是错误的是facebook不是来自ProjectB的直接子文件夹...但是在ProjectBRoot中构建时无关紧要.这可能是由于我直接引用ProjectB而不是通过ProjectBRoot/gradle.build引用的面孔,但我尝试了它,但它也没有用.有人可以帮助我,我已经查看了文档,它没有谈论有多个项目有自己的settings.gradle文件,我认为这是搞乱我的事情.
更新:
所以我按照Xav的回答,我现在能够使用命令行构建,但我无法使用android studio导入/构建.我知道问题仍然是facebook项目.我得到的错误是它无法配置ProjectB.
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.
Run Code Online (Sandbox Code Playgroud)
该错误是由该行引起的
compile project(':facebook-sdk')
Run Code Online (Sandbox Code Playgroud)
在ProjectB/build.gradle中
Xav*_*het 94
settings.gradle必须定义所有模块.它不会加载树中的其他settings.gradle来加载更多模块.
你必须要么
在顶级settings.gradle中为facebook SDK定义一个模块.是的,它与其他settings.gradle是多余的.
以某种方式发布Project B(以及它的依赖关系,所以在这种情况下是facebook SDK库),某处(例如公司工件库)并从Project A访问它.
虽然#1更好,但它会使ProjectB - > Facebook依赖变得棘手,因为路径将根据所使用的settings.gradle而有所不同.解决此问题的一种方法是将模块名称/路径从其在磁盘上的实际位置拆分.这是在settings.gradle文件中完成的.
在顶级settings.gradle文件中,执行
include 'facebook-sdk'
project(':facebook-sdk').projectDir = new File('Libraries/ProjectBRoot/Libraries/FacebookSDK/facebook')
Run Code Online (Sandbox Code Playgroud)
在项目B内的setting.gradle文件中,使用不同的相对路径执行相同操作:
include 'facebook-sdk'
project(':facebook-sdk').projectDir = new File('Libraries/FacebookSDK/facebook')
Run Code Online (Sandbox Code Playgroud)
这使得两个项目设置都定义了位于磁盘上相同绝对位置的相同"facebook-sdk"模块.
依赖于此模块的所有项目都应该将依赖关系声明为
compile project(':facebook-sdk')
Run Code Online (Sandbox Code Playgroud)
这不是你要找的答案,但......
我花了大约4天时间尝试将我复杂的项目结构(实际上与你的实际情况很相似)迁移到gradle中.最后,我放弃了整个子项目的概念(因为在我的情况下,它只是没有用),我选择使用本地maven存储库方法,如本文所述:http://www.flexlabs .ORG/2013/06 /使用本地-AAR-Android的库封装功能于gradle这个-建立
因此,在我的具有子项目的图书馆项目中,我基本上为每个项目创建了完整的库项目,然后我使用上面的链接将这些项目发布到maven本地存储库.然后在父项目中,我删除了对子项目的任何引用,在依赖项中,我只引用了已发布的库.然后在我的主项目中,删除了对子项目的所有引用,并引用了我的库的已发布的maven本地版本.
最后,一切都运作良好,但确实需要一些时间来转换所有内容.我有大约6个子项目的图书馆项目,子项目等,现在一切正常.
我不喜欢像Gradle和Maven这样的系统的事情是他们真的希望你改变你如何构建代码/项目.因此,如果您要迁移到Gradle而不是从Gradle开始,那么这个过程可能非常令人沮丧.一旦你搞清楚了,下一次就容易了;)
| 归档时间: |
|
| 查看次数: |
65593 次 |
| 最近记录: |