本文转载自公众号《读书芯》(ID:AI_Discovery)假设你刚加入新公司的新团队,想开始从事编码库的工作。您将面临的第一个问题是:将团队项目的源文件添加到哪里?好问题。新团队拥有三个用于添加文件的源目录。您需要知道您要使用哪一个,团队成员正在使用哪个以及哪些文件需要重构。多年来,SlackiOS团队在编码库方面做得更好。我们来这个团队是因为我们几次想构建一些源文件,但是缺乏编码库的架构模式,也因为这几年开发者越来越多。我们有来自顶层的大约13000个文件(并且还在增加),大约27个顶层目录,Objective-C和Swift文件的混合,以及大约40名iOS开发人员在一个monorepo中工作。SlackiOSXcodeFileHierarchy2017这些是所有文件层次结构状态的真实图片。新员工不断抱怨进入编码库,而我们已经习惯了操纵这些混乱的目录,以至于忘记了最初的痛苦。我们有无数的源代码目录(具体是iOS、SlackCocoaSDK和Slack目录),确定目录需要很长时间,然后再决定如何添加文件。此外,我们决定向编码库添加新工具,但Xcode项目的当前状态不能很好地支持新添加的工具。因此,我和一群iOS开发人员决定开始制定以下几条规则:让任何开发人员(无论新老)都能快速轻松地添加新文件。按照我们在目录中的设计模式工具可以自行维护新的和干净的文件夹这将是一个两步过程:首先将顶级目录移动到一个连贯的顺序(主要目标目录、扩展目录、框架等),以及然后是大任务——源文件夹的形成。顶级目录的移动没有??争议,也不难做到。几个开发人员一起工作可能需要数周时间。在第一步中,我们学到了一些可以在后期使用的技巧——错过处理大动作的高峰时间,始终合并master,及时浏览评论。合并冲突并不是这个过程中唯一棘手的事情,我们实际上可以更好地消除与xcodegen的冲突,大部分冲突都在项目文件中。我们还希望保留git历史记录,并能够始终一目了然地看到git和finder中的文件。但我们倾向于更简单的方法,让每个人都参与进来,将文件拖放到主页。SlackiOSXcodeHierarchy2017(左)和2018(右)从这张2018年9月的图可以看出,我们已经能够成功建立顶层目录,这样每个目录都是适用的,都是顶层目录.构建源文件现在是处理iOS、SlackCocoaSDK和Slack中的源文件并将它们全部移动到App或Source的时候了。老实说,我被这部分吓坏了。我们需要有一个清晰的模型,让团队中的所有开发人员都参与进来,需要易于移动的规则和工具,并且工程师可以清楚地看到他们是否犯了错误。来源:unsplash笔者对层级结构模式进行了大量考察,发现关于文件夹形成的文章非常少。Uber在这篇文章(https://eng.uber.com/ios-monorepo/)中介绍了他们是如何进入单一存储库的。这阐明了我们如何将代码库划分为小模块(尺寸更小)。最后,作者为团队提供了三种选择:Functionalconstructiontheme(基于架构的组织)Ontology(基于关系或类似分组的组织)团队将首先关注高级功能,然后在主题或功能目录中进行MVVM+C。这是新结构中的一个文件夹:/FeatureFolder/Coordinators/Models/Tests/Functional/Mocks/Unit/ViewModels/Views移动源文件是一个冗长而繁琐的项目。处理合并冲突很烦人,搜索文件命名空间以查看将所有功能文件拖到一个目录中是否比最初想象的更难记住,并且大多数被移动的文件不适合您开始使用规则设置的文件夹.幸运的是,有勇士挺身而出,迈出了一大步——将iOS、SlackCocoaSDK、Slack移至App/Source。2020年1月层次结构文件夹的屏幕截图:SlackXcodeFileHierarchy2020在移动这三个大型源目录时,我们发现Danger规则会阻止向这些目录添加文件,因此我们开始使用我们的新模式。Danger是持续集成系统中使用的一个工具,可以在提交后进行自动检查,并向PRS发送警告和错误信息。这是它的样子:has_slack_directory_additions=!git.added_files.grep(/Slack/).empty?has_slackcocoasdk_directory_additions=!git.added_files.grep(/SlackCocoaSDK/).empty?has_ios_directory_additions=!git.added_files.grep(/iOS/).empty?ifhas_slack_directory_additions||has_slackcocoasdk_directory_additions||has_ios_directory_additionsfail('ThisPR将新文件引入到为添加新文件而关闭的目录中。请使用
