热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多个框架和通用库

如何解决《多个框架和通用库》经验,为你挑选了1个好方法。

iOS 8, Xcode 6.

比方说,我有2个动态的框架,frameworkAframeworkB和他们都依赖libC.另外,我有一个使用frameworkA和的应用程序frameworkB.我最初的想法是制作frameworkAframeworkB伞框架和libC子框架.但是,Apple建议不要使用伞形框架,这篇文章描述了为什么由于潜在的链接器冲突问题,伞形框架是一个坏主意.

我的第二个选择是使用cocoapods(对于细节仍然是新的,因此有点模糊)libC作为一个pod然后被编译成frameworkAframeworkB.然而,在我看来,两个框架仍然有自己的副本libC.由于应用程序使用两个框架,这是否会导致链接器冲突问题?有没有更好的方法来解决这个问题?

更新 @Rob我工作的项目确实需要复杂的依赖关系管理,但我在问题中保持问题域的简单性,试图更好地理解如何使用cocoapods来帮助解决伞框架的链接器冲突问题.我与一组编写库的开发人员合作,可以依赖彼此提供版本化通用API的基础库.我们需要将尽可能少的库打包并交付给使用我们的库构建应用程序的不同组织,其中一个关键要求是我们提供动态框架.



1> Rob Napier..:

解决大多数问题的最佳方法是将所有代码放在项目中并进行编译.当你遇到有问题的专门问题时,你应该看看其他解决方案,比如静态库,最后是框架.

如果您的代码库具有需要不同构建要求的部分,则静态库可能有意义.如果所有部分都具有相同的构建设置,那么只需从"公共"目录"添加文件"到项目中并构建项目.如果您的构建时间非常长并且某些部分永远不会更改并且您希望能够"清理"而不重建这些部分,则静态库可能很有吸引力.但是在你开始复杂的多包项目之前,请等到你开始遇到这个问题.

如果您销售闭源库,那么框架非常有吸引力.出于您注意的原因,您应该强烈避免添加第三方依赖项.如果必须,最好的方法是帮助您的客户将所有部分打包为框架,并让它们在最后链接所有部分.但这增加了很多烦恼; 所以确保你真的需要第三方作品.

如果您有一大块可重用的代码,并且它们自己的生命周期与主要产品分开,您也可以考虑使用框架.但同样,保持简单.避免在其中使用第三方内容,如果您必须拥有第三方内容,请让消费者在最后链接它.

(这不是一个新的解决方案,顺便说一句.当你使用curl时,如果你想要SSL,你还需要下载并构建OpenSSL并将它们自己链接在一起.Curl不附带内置的OpenSSL.)

但在绝大多数情况下,这都是矫枉过正.不要跳转到框架.不要跳到图书馆.只需将所有代码放入项目中并进行编译即可.90%的问题都会消失.特别是iOS项目通常不是那么大.解决框架有什么问题?

如果您的组织在很多产品中反复使用了大量代码,那么我听说很多团队都有好运使用内部CocoaPod来管理它.但这只是为了简化检查代码.它仍然进入一个项目,你将它们一起编译成一个二进制文件; 没有框架需要.对于某些以前非常痛苦的问题,动态框架是一个很好的特性.但是,在大多数情况下,他们只是寻找问题的复杂性.

(如果您有其中一个专门的问题,请编辑您的问题,我很乐意进一步讨论如何处理它.)


编辑:(你陷入了"专业问题",所以我们来谈谈它.我在多个大型多人团队Mac和iOS开发环境中做了很多年.我们尝试了几乎所有不同的解决方案,包括Frameworks他们只是iOS上的新手.)

在您描述的组织内,我强烈建议将每个依赖项打包为自己的框架(AFNetworking,JSONKit等)以及每个部分作为框架,然后让应用程序开发人员将所有这些依赖项链接在一起.通过这种方式,它与其他动态库(libcurl,openssl等)相同,后者需要app dev将所有内容链接在一起.

在任何情况下,动态框架都不应包含其他可能需要的框架(即框架不应包含"第三方"内容).那会爆炸.你不能让它不爆炸.您可能会遇到膨胀,构建冲突或运行时冲突.就像合并冲突一样.开发者必须做出选择.应用级链接正在做出这种选择.

使组件过度依赖其他组件是几十年的麻烦的源头,从Windows DLL Hell到具有竞争崩溃处理程序的iOS应用程序.所有最好的组件系统看起来都像Legos,最终用户组装具有最小依赖性的小块.尽可能让你的内部框架只依靠Cocoa.这有一些有形的设计影响:

避免直接需要日志记录或分析引擎.提供可以适应调用者引擎的委托接口.

避免使用简单的类别(只保存几行代码的方法).只需直接编写代码即可.

避免添加不会为您带来太多购买的框架依赖项.不要AFNetworking只是为了保存几行代码而添加NSURLConnection.当然,如果你在很大程度上依赖于另一个框架的功能,那就不同了.但作为框架开发人员,在需要另一个框架之前,您的阈值应该非常高.

强烈避免在构建或版本控制中变得聪明.我见过很多人都希望为应用级开发人员"自动"创建所有内容,因此使系统变得非常复杂.只需说"你需要链接这个并导入它并将其放入你的app delegate startup中." 不要创建复杂的构建和版本控制系统,以便在第一个构建或两行初始化逻辑上节省2分钟.这些东西爆炸,浪费时间来解决.不要用+load魔法聪明.只要说清楚和一致.

当然,祝你好运.支持其他开发者总是一个有趣的挑战.


推荐阅读
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 使用Jenkins构建Java项目实践指南
    本指南详细介绍了如何使用Jenkins构建Java项目,包括环境搭建、工具配置以及项目构建的具体步骤。 ... [详细]
  • 了解如何快速搭建属于自己的个人博客,无需编程基础,适合Mac和Windows用户。通过本文,您将学会使用GitHub Pages和Hexo构建一个完全自主的在线空间。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 本文详细介绍了如何在PHP中进行数组删除、清空等操作,并提供了在Visual Studio Code中创建PHP文件的步骤。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文深入探讨了 PHP 实现计划任务的方法,包括其原理、具体实现方式以及在不同操作系统中的应用。通过详细示例和代码片段,帮助开发者理解和掌握如何高效地设置和管理定时任务。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 本教程旨在指导开发者如何在Mac上设置React Native的开发环境,以进行iOS应用的开发。文中详细介绍了必要的软件安装步骤,包括Xcode、Homebrew、Node.js、Watchman以及React Native CLI等工具的安装方法。 ... [详细]
  • 本文探讨了C++编程中理解代码执行期间复杂度的挑战,特别是编译器在程序运行时生成额外指令以确保对象构造、内存管理、类型转换及临时对象创建的安全性。 ... [详细]
  • 本文详细介绍了一个既适用于PHP5也适用于PHP7的cURL文件上传解决方案。此示例源于项目需求,旨在通过cURL实现文件上传功能,并解决不同PHP版本间的兼容性问题。 ... [详细]
  • 从 Windows 转向 Mac 的开发者指南:必备技巧与工具
    本文旨在帮助从 Windows 转向 Mac 的开发者们,提供一系列实用的技巧和工具,确保过渡过程顺畅。 ... [详细]
author-avatar
acChristina
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有