繁体   English   中英

Android Studio Gradle外部库项目

[英]Android Studio Gradle External Library Project

好吧,我意识到Gradle和Android Studio似乎认为所有的图书馆应用程序都是为一个项目和一个项目而构建的,但事实并非如此。 我有许多共享的库应用程序,其共同目的是在整个组织中共享。 Gradle似乎不太适应这种理想的解决方案。 有人可以提供任何见解吗?

我目前的结构处于一个非常基本的层面是这样的:

|--Directory
|  |--PROJECT A
|     |---Module 1
|  |--Project B
|     |---Module 2
|  |--Project c
|     |--Module 3

/////////////////////////////////////////////我当前的依赖结构是像这样: /////////////////////////////////////////////

项目A :(仅供参考,建造得很好)

项目A的settings.gradle

include ':Module 1', ':Module 2'
project(':Module 2').projectDir = new File('../Project B/Module 2')

第1单元的build.gradle

dependencies {
    compile project(':Module 2')
}

项目C:(仅供参考,BROKEN)

Project C的settings.gradle

include ':Module 3', ':Module 1'
project(':Module 1').projectDir = new File('../Project A/Module 1')

模块3的build.gradle

dependencies {
    compile project(':Module 1')
}

中断:无法解析模块1的build.gradle文件中的模块2。

这是因为模块2的目录结构是在Project A的settings.gradle中建立的,因此Project B不知道从哪里渲染它。

我明白我可以添加

project(':Module 2').projectDir = new File('../Project B/Module 2')

到项目C,一切都会正常工作。 但是,Project C不使用或不了解模块2.我希望其他开发人员可以自由使用我的公共共享库项目,而无需深入了解我使用的库项目,并将其包含在他们的设置中。 如何在build.gradle中指定我自己的依赖项目录结构而不是settings.gradle,以使所有使用它的人都可以访问它?

在第二个注释,但类似的主题。 我对JAR文件有完全相同的问题。 如果我在库项目的build.gradle中指定一个REPO,如:myRepo1并且有一个myJar1。 然后,当该库项目用于未在库项目依赖项部分中定义包含jar的repo的父项目时,当编译项目(':libproject')时,它无法从库项目中解析jar文件用过的。 我必须在父的build.gradle文件中复制repo指针,以便libproject将从父应用程序构建。 对此的任何帮助也将受到赞赏。 因为不是每个应用程序都在每个应用程序中使用,所以这可能变得多余。

好吧这是一个非常古老的帖子,但仍然有牵引力所以让我更新3年后,因为我最初写它大声笑。

向一位从一开始就拥有正确最佳实践想法的CommonWare致敬,但没有给出标记的答案。

首先让我说,像我上面那样使用项目引用应该仅限于开发阶段,并且只应该在库项目与主项目同时处于开发阶段时才应该这样做。 否则,首选依赖管理服务器,如Nexus,Apache Archiva或具有Maven目录结构或等效的S3。 我已经学习了许多管理依赖关系的方法,包括传递依赖关系管理。

我首选的方法是将带有POM文件的工件部署到Apache Archiva,然后在父项目中使用这些依赖项,而不是使用相对路径来引用代码项目。 这是第一选择。

但是,如果您对依赖项管理过于陌生并选择不为此目的安装服务器,则可以将AAR文件或JAR文件打包并将它们放在一个集中的repo中,例如artifact_repo,并让每个人都在同一个文件夹结构中包含该repo。并且相对地引用它们,但这不是好的做法,所以如果可以,我会引导清楚。

您也可以将这些工件并将它们嵌套在libs目录中,如果您愿意,可以将它们以这种方式引入,但它更像是一个人们喜欢的手动更新过程,而其他人则不喜欢。

现在,这将打开您需要处理的一整套不同的问题。

传递依赖和儿童回购指针。 例如,如果您围绕Fabric或Hockey包装自己的Crash Reporting Library或希望以后可以轻松交易库,那么您发现repo指针必须存在于父build.gradle文件或传递依赖项中。未找到。

你当然可以使用那些hacky Fat_AAR或Fat_JAR脚本中的一个“有时”工作,直到更新的gradle然后它们再次中断,直到有人将它重新组合在一起,但这也是一种糟糕的做法,因为你在支持或其他重要方面创建了潜在的不匹配依赖性子库和“exclude transitives”仅在您使用pom文件来控制传递而不使AAR或JAR文件变胖时才有效。 所以你限制了你控制依赖的能力。

所以我最终接受的是,传递依赖应该通过POM文件来管理,以允许排除或包括不嵌套到子库中。 此外,在它们内部需要repo指针的库可能不存在,因为它们需要父样板,为人为错误引入空间,并且通常不会节省很多时间来包装分析或崩溃库,或者你开始进入json配置需要为PUSH或其他原因生活在父文件中。 避免它。

这么长的故事很短暂的哈哈。 坚持使用他们想要使用的依赖管理工具,你会没事的。 当你刚接触它或者开始变得hacky时,你会遇到丑陋的代码和丑陋的问题。 希望这能鼓励某人以正确的方式去做:)

最后一件事 :)。 我最近开始编写Gradle插件来管理我的版本和依赖项作为一个单独的文件,这样我就可以使用intellisense来提取依赖关系,并确保所有项目中的所有支持,gms和工具版本都相同。 您甚至可以使用插件复制实时模板,以便为Gradle启用intellisense以处理您的内容。 做起来并不算太糟糕。 祝你好运和快乐的Gradling :)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM