Tag: git

吉特·胡克斯

当git在2005年推出时,它不仅改变了Linux社区,而且改变了许多开发过程。 突然之间,您不必再在一个分支机构工作了。 相反,您将为每个功能创建一堆分支,甚至更改一个分支并在以后合并它们。 它是如此的简单和快捷,没有理由不再这样做。 即使在创建新项目时,Xcode也会为您设置一个git存储库。 我记得与Perforce一起工作,与git相比,这是一个很大的麻烦。 检出文件,使它们不再受到写保护,检查哪些文件已更改,忽略本地用户相关文件(尤其是有关.xcodeproj文件的文件),并尝试在创建后合并几个月。 拥有两个不同的开发分支并没有真正帮助。 由于git是一个很好的工具和事实上的标准,我不会详细介绍如何使用它,但是有一个很好的功能,并不是每个人都知道。 钩子 Git可以选择向每个提交添加钩子。 根据您添加的钩子,将执行不同的用户定义脚本。 一些可用的挂钩是: Applypatch-msg 预先贴布 申请后 预先提交 准备提交消息 提交消息 准备提交消息 prepare-commit-msg挂钩将执行一个脚本,该脚本获取作为第一个参数$ 1传递的提交消息。 有了这个,我们现在可以根据需要任意更改消息。 在讨论有关提交消息的约定时,让我们检查容易忘记的内容以及可以自动化的部分: :以现在时的描述 由于我们为分支机构指定了票证名称,因此很容易提取: $(git branch | grep ‘*’ | sed ‘s/* //’) 此外,我们可以通过提取消息的第一部分并将其与我们拥有的不同类型进行比较来检查提交的类型: value=`cat $1` type=”$( cut -d ‘:’ -f 1 <<< "$value" )" contains=$(echo ${typeList[@]} | grep -o type | wc […]

IBM Kitura Bluemix-XCode设置

第一部分是如何在Mac上创建Kitura Project并将其推送到Bluemix上。 有很多方法可以做到这一点。 我选择以下方式,因为我希望能够在xcode上编写所有代码并运行本地服务器进行调试。 您可以在以下存储库中找到项目的完整源代码: zirinisp / XCodeKituraBluemix XCodeKituraBluemix – IBM Kitura Bluemix的入门Xcode项目 github.com 克隆Kitura-样品 打开终端并输入以下内容 git clone https://github.com/IBM-Bluemix/Kitura-Starter.git 重命名项目(可选) 打开Package.swift并将应用程序名称(Kitura-Starter)更改为所需的名称。 打开manifest.yml并将命令:更改为新的应用名称。 转到Sources文件夹,然后将Kitura-Starter文件夹重命名为新名称。 在xcode上运行 运行以下命令以生成Xcode项目: 迅捷包generate-xcodeproj 这将生成一个.xcodeproj文件。 在Xcode上打开 在顶部选择可执行文件: 然后运行(cmd + r)。 这将构建并运行Web应用程序。 因此,您可以忽略命令行生成和运行命令。 完成后,打开一个野生动物园窗口并访问:http:// localhost:8090 哪个应该给您Kitura入门样本页面 添加包裹 请记住,使用此设置,如果要添加新的swift程序包,则必须运行 迅捷包generate-xcodeproj 再次,因此新软件包将安装在xcode项目上。 我希望有一天xcode可以整合该过程,并且能够自动进行。 调试 您可以尝试在Controller.swift文件的getHello函数上添加断点。 然后访问localhost:8090 / hello,断点将被激活。 这非常有用,因为我们可以使用xcode的调试器。 为什么我不使用IBM Cloud Tools 我尝试使用它们,它们似乎使开发过程过于复杂。 我找不到在多台计算机上使用它们的方法。 我同时在iMac和MacBook上进行开发,并使用源代码控制来同步项目。 IBM […]

iOS-CI / CD和内部版本号

近一个月(或更长时间),我正在尝试找到处理iOS应用程序内部版本号的最佳方法。 好吧,是的,如果您是唯一处理代码的人,这绝对是容易的。 但是,即使在这种情况下,值得有人照顾也是值得的,为什么不呢? 另外,在一个正确建立的构建管道中更有意义。 因为找出大多数自动化的东西总是更好的,因为它可以帮助团队中的所有开发人员最少地担心它。 在开始共享我的解决方案之前,我觉得最好退一步并分享我的发现背后的思考过程。 敏捷开发是所有软件开发行业的需求。 在这里,您必须以可装运产品的形式交付一小部分工作。 因此,您完成了一个工作项(用户故事/ Jira票证等),然后将构建版本发布到质量检查中。 这正是您想到的一个步骤,我将如何自动增加内部编号以使每个人的生活变得轻松? 现在,当我说“正确建立的构建管道”时,至少意味着您具有代码的基准主分支,每个开发人员都使用该基线主分支来创建该分支,以进行特定工作项的工作。 一旦完成工作,他们就必须将其分支合并到master分支中,这是QA接收构建的地方。 因此,简单的步骤看起来像- 1.选择要处理的项目并从母版创建分支 2.完成工作并提交+将更改推送到分支 3.合并代码到master分支 4.假设CI / CD版本是从master分支构建的,则您的QA将获得一个新的构建以测试您的工作 等一下…。 我在哪里更新内部版本号? 到目前为止,这是答案。 在发现阶段,我遇到了以下选项,该选项可以帮助您维护iOS应用程序的内部版本号- 在.plist文件中手动更新您的内部版本号,然后执行commit + push,然后合并代码(是的,我也不太喜欢它。 使用Fastlane的crement_build_number操作(更多信息在这里) 使用XCode agvtool(更多信息在这里) 发布构建阶段脚本(更多信息请点击此处) 所有选项都包含在此处,并在一篇文章中进行了说明 即使拥有了上述所有选项,我仍然想写这篇文章并共享我的解决方案,因为我认为这些参考足以了解增加内部版本号的方法。 但是,仍然缺少如何在CI / CD管道中实际实现这一目标的步骤? 更重要的是,哪一个最容易且最适合CI / CD? 提出最佳解决方案的方法与开发人员在发布构建版本的过程中执行的实际步骤一致。 因此,步骤是- 设置内部版本号(例如#1 完成工作项 将代码合并到Master分支 生成(#1)由管道释放 增加内部版本号(#2)以用于下一个版本 …..并重复这些步骤。 我之所以认为它与实际步骤一致,是因为首先设置内部版本号,然后开始为其工作,而不是以其他方式进行,这是有意义的。 因为管理内部版本号非常容易,并且更适合实际版本号的实际情况。 意思是,一旦您将1.0版本发布到App Store,此后您要使用的是下一个版本号,而不是1.0版本。 因此,更有意义的是先更新版本号,然后再开始使用它。 这也将有助于跟踪所有可交付成果到正确的版本。 例如,在开发过程中针对特定版本执行的测试用例,等等。 这样,它也是内联的,内部解释也一样。 […]

自动生成变更日志

本文是Fueled上有关构建自动化的一系列博客文章中的第一篇。 更多即将推出! 在Fueled,正确的变更日志对所有从事项目的团队都很重要: 质量检查团队,使他们知道可以测试什么 客户和项目经理,以便他们知道已完成的工作 开发人员,以便他们可以快速参考所做的工作 我们全年采用了一种相当敏捷的方法来改进变更日志,以达到今天的状态。 我希望与您分享迄今为止我们在流程中取得的一些主要收获,并就我们可能会继续改进的地方提出一些建议。 我们最初的方法是只为客户构建简单的变更日志,并在内部依靠适当的Jira故事更新来跟踪项目的状态。 尽管此方法行之有效,但是却需要有人编写变更日志并手动更新Jira故事,而可能会忘记此处的功能或此处的错误修复。 因此我们认为: “有没有办法使它自动化?” 那是我们了解语义提交消息的时间 。 语义提交消息允许简洁地描述提交的内容,还可以选择在提交正文中添加更多扩展的消息。 在Fueled,我们使用以下格式的提交消息: (): 其中type是以下之一: feat :一项新功能 fix :错误修复 性能:性能增强 docs :文档更新 refactor :代码重构 test :添加/更改/删除单元测试 style :样式更改(更新缩进,将空格更改为制表符等) chore :配置更新,代码签名更改,… scope是在提交中更改的应用程序的一部分。 即,如果您有登录流程,并且在那里更新了UI,则可以使用feat(login): 。 它始终以小写字母和破折号分隔单词,即video-player , code-signing等。 message只是一条简短的命令性消息(至少少于80个字符),描述了提交中的操作(就像您告诉项目的操作一样) 以下是一些来自我们项目的示例: feat(settings): add button allowing user to log out fix(offline-mode): fix issue where success popup […]

在五分钟内用[Space Commander]和[xcpretty]插入您的Objective-C项目

为什么您的Objective-C存储库没有统一的代码格式? 使用Space Commander,您可以: 在提交代码之前强制执行格式约定。 使用单个命令(单个文件或整个存储库)格式化代码。 如果未格式化的代码进入分支,则构建会失败(在请求请求期间)。 (* https://github.com/square/spacecommander) 将spacecommader拖放到项目文件夹中 2.运行setup-config.sh ./config/spacecommander/setup-config.sh 3.要就地格式化存储库中的所有Objective-C文件,请运行 ./config/spacecommander/format-objc-files-in-repo.sh

贡献给WWCodeDFW iOS项目

设置完项目后,就可以开始进行贡献了! 检查回购的问题标签以查找需要处理的内容。 有自己的想法要补充吗? 创建一个问题,将其分配给自己,然后开始工作! 如果您想参加Digital Ocean的Hactoberfest活动,请务必用“ Hacktoberfest”标签标记问题。 容易完成的任务都标有“好问题”的标签,我创建的所有问题都具有指向文档/方法的链接,以帮助您入门。 一旦准备好进行编码,请从development创建一个分支,然后在其中提交更改。 确保以您当前正在处理的问题为分支命名。 如果您需要git教程,那么Git文档和git教程都适合初学者! 将分支推送到远程后,转到github创建请求请求! 从仓库的主页中选择“创建请求请求”。 从标题为“比较”的右侧下拉列表中选择分支。 从那里,点击“创建请求请求”按钮。 如果存在合并冲突,则必须先解决它们,然后才能将拉取请求合并到开发中。 而已! 创建拉取请求并解决所有冲突后,我们将能够合并您的更改! 如果还没有,请加入Slack的’dfwiosapp’频道,然后查看更多可解决的问题! 如果您想提供帮助,但是添加代码似乎很吓人,请随时为问题积压添加想法。 欢迎任何大小的捐款! 快乐编码🤘🏻

将框架添加到iOS应用

如何使用Git子模块向Xcode项目添加框架。 介绍 在Xcode中构建iOS应用时,我们经常需要从另一个项目中添加代码。 向其他应用程序添加功能的项目通常旨在构建“框架”目标。 框架使您的项目受益于其他人的辛苦工作,因此您不必重新发明相同的轮子。 我们可以下载框架代码文件的副本并将其添加到我们自己的项目中。 但是,我们的副本将立即与原始存储库不同步。 为了继续享受别人的工作带来的好处,我们最好使用使我们的副本与原始副本保持同步的机制添加“子项目”。 添加外部存储库,子项目和框架 通常,要在Xcode中使用外部框架,您需要: 将某种同步链接添加到外部存储库并下载。 在Xcode的文件浏览器中,将外部.xcodeproj (Xcode项目)文件作为子项目添加到您自己的项目中。 将框架添加到项目的构建阶段。 实际上,这实际上比听起来简单得多。 例如,步骤2是一次拖放操作,而步骤3涉及单击两个按钮。 在本教程中,我们将详细介绍这些步骤。 如果在任何时候都让您感到困惑,那么我建议您阅读“构建像Lego这样的应用程序”教程,该教程假定您以前没有Xcode或编码知识,并逐步构建应用程序,包括添加框架(在教程中)。 8)。 管理外部存储库的选择 有多种机制可用于将子项目同步到您自己的项目中。 它们包括: Git的子模块 可可豆 迦太基 使用子模块是Git版本控制系统的固有组成部分,并且已经存在了很长时间。 这样一来,您无需安装其他任何东西即可工作,并且相对易于使用。 它已集成到主要的Git流中,因此,例如,当您提交代码时,Git会自动知道要提交子模块代码中的所有更改。 如果您为Git使用GUI,例如SourceTree,它将为您处理子模块。 我听说过,子模块中引用最多的限制是难以管理子模块之间的交叉依赖关系,其中两个子模块可能需要各自加载第三个子模块。 CocoaPods处理交叉依赖关系,并处理上述所有三个步骤。 但是,我认为在没有GUI工具的情况下进行设置需要花费更多时间,并且这阻碍了我对子模块进行更改的能力。 在本教程中,我们将使用一个子模块。 BFWControls框​​架 在本教程中,我们将向Xcode项目添加一个名为BFWControls的框架。 这些步骤与添加任何框架相同。 如果要添加其他框架,可以按照此处的步骤进行操作,但只需将BFWControls引用替换为所需的存储库即可。 BFWControls包含大量功能,可简化Xcode的Interface Builder中的可视化应用程序制作。 创建自己的Xcode项目 如果您已经有一个要在其中添加框架的Xcode项目,那么您都准备开始本教程。 如果您尚未准备好Xcode项目,则可以使用任何iOS模板创建一个新项目。 或者,在添加框架后,跳至在Storyboard教程中嵌入Xib以创建具有自定义视图的基本应用程序,以测试框架是否正常运行。 在本教程的其余部分中,我将使用XibSample项目中的快照。 如果您使用的是不同的Xcode项目,那么您的屏幕当然看起来会略有不同。 准备一个子模块文件夹 我们可以将子模块代码放在Xcode项目中的任何位置,但是让我们创建一个Submodules文件夹以使其明显分开。 X在Xcode中,添加一个名为Submodules的新组。 👉启动Terminal并cd到新的Submodules目录。 只需将Xcode的Submodules文件夹直接拖到“终端”窗口中,并在松开鼠标按钮的同时按住Command键即可做到这一点。 添加子模块 👉仍在终端中,键入(或复制并粘贴): git submodule add […]

iOS开发课程:从Xcode,Git,MVC开始

Xcode中包含哪些控件,如何使用Git保存代码版本,什么是Application类,什么UIViewController生命周期以及介绍Model-View-Controller设计模式… 您是快速编程语言的新手吗? ***立即开始Swift课程! *** 应用程序的应用程序对象的主要作用是处理传入的用户事件的初始路由。 它将控制对象( UIControl类的实例)转发给它的操作消息调度到适当的目标对象。 应用程序对象维护一个打开窗口的列表( UIWindow对象),通过这些窗口可以检索应用程序的任何UIView对象。 进一步了解Apple UIViewController类定义了所有视图控制器共有的共享行为。 您很少直接创建UIViewController类的实例。 相反,您可以继承UIViewController子类,并添加管理视图控制器的视图层次结构所需的方法和属性。 视图控制器的主要职责包括: 通常根据对基础数据的更改来更新视图的内容。 响应用户与视图的交互。 调整视图大小并管理整个界面的布局。 与应用程序中的其他对象(包括其他视图控制器)进行协调。 进一步了解Apple 模型-视图-控制器(MVC)设计模式为应用程序中的对象分配以下三个角色之一:模型,视图或控制器。 该模式不仅定义了对象在应用程序中扮演的角色,还定义了对象之间的通信方式。 三种类型的对象中的每一种都通过抽象边界与其他对象分开,并跨这些边界与其他类型的对象进行通信。 在应用程序中,某些MVC类型的对象的集合有时称为“ 层” ,例如模型层。 MVC对于可可应用程序的良好设计至关重要。 采用这种模式的好处很多。 这些应用程序中的许多对象倾向于更可重用,并且它们的接口倾向于更好地定义。 具有MVC设计的应用程序也比其他应用程序更容易扩展。 此外,许多可可技术和体系结构都基于MVC,并且要求您的自定义对象扮演MVC角色之一。 进一步了解Apple *** GitHub项目*** ***快速的MVC设计模式*** *** Xcode的MVC模块模板*** 你完成了! 拍! 拍! 请记住,成功的秘诀是不断学习和与同事沟通,包括自我教育。 这是有关iOS开发入门的小指南。 在Apple Developer网站上了解更多信息。 不要停止自我教育。 订阅我的帐户以获取有关新故事的通知。 如果您还有问题,请在评论中写。 我将在以后的文章中回答。

iOS用于iOS开发的分支模型。 与Bitrise持续集成

当我开始在目前的公司工作时,我们为iOS平台准备的设置完全在本地托管:用于回购的Bitbucket Server ,作为构建平台的Jenkins和用于分发的Hockeyapp自己实现(据我了解,从Hockeyapp是一个开源项目的过去)。 所有这些都由外部机构(开发我们的应用的机构)负责。 我被分配的首要任务之一是这些服务的内部化,以便变得独立并控制开发周期。 为了托管存储库,我们将使用Bitbucket Cloud和Hockeyapp进行分发,但是由于我们公司根本不托管任何服务器(我们的基础架构主要在AWS的保护下运行),因此不能选择照旧执行Jenkins实施。 我当时在寻找新的云CI / CD平台 。 iOS云连续集成服务器奥运是一个很好的起点。 由于我们不是在开发仅限iOS的应用,因此未考虑buddybuild。 经过研究后,两个最终入围者是CircleCI和Bitrise 。 初始步骤 我最初的选择是CircleCI,但即使我遵循了一些教程,但也无法使签名生效。 它可能比Bitrise提供更多的自定义功能,但是对于一个不知道他在做什么的人来说,像Bitrise那样拥有一个构建模块界面在这样的早期阶段是关键 。 客户服务部门也迅速回答了我的问题,这也是迁移到Bitrise的另一个原因。 在链接了所有步骤(基本上使用了Bitrise推荐的模板)之后,构建平台就可以正常工作了。 局限性 我们有三个主要工作流程:暂存,候选发布和分发。 暂存和发行候选人将在我们的develop分支中建立,而发行将在master建立。 当几个主要功能准备好以更成熟的状态集成在一起,从而触发候选发布版本时,将应用相同的方法。 从beta到release将会执行手动合并,从而生成一个新的候选版本的应用程序。 此发行候选版本可能会被发送到iTunes Connect 。 如果最终测试和审核过程令人满意,则将发布该应用程序,并进行从release到master release的手动合并, 包括带有版本号的标签 。 理想情况下 , master 分支将包含在AppStore中发布的所有应用程序版本,并带有正确标记 。 ➜git checkout主 ➜git tag v.1.2#举例 ➜git push-标签 所有不同版本都会生成两个.ipa文件,一个针对我们的暂存后端,另一个针对我们的实时服务。 为了使我们(和我们的测试人员)更容易知道哪个版本针对什么,我们分配了不同的应用程序图标,包括版本名称和后端环境: 这些应用程序已上载到HockeyApp,我们的测试人员团队可以在其中查看和下载它们。 这就是我们当前的设置。 谢谢阅读! ✌️

真正的团队如何处理iOS Storyboard

故事板。 你不能和他们住在一起。 没有他们,你活不下去。 作为团队一部分构建iOS应用的任何人都知道,合并地狱中有一个特殊的圈子专门解决此特定问题。 使用源代码控制, 将所有应用程序的UI设计放在单个文件中是不现实的。 您团队中的太多人将触摸该文件。 很快,任何东西都不会自动合并,因为情节提要中存在冲突。 当然,我们还希望故事板附带所有假定的好处。 原则上,希望在一个视图中查看应用程序的整个流程似乎是合理的。 不用说,拥有用于设计UI的可视工具真的很棒。 多年以来,我们一直吃着蛋糕,但也无法食用。 为什么? 这似乎是我们应该能够解决的问题。 今天的团队如何管理情节提要 我参与的最好的团队总是会在第一天就了解某种情节提要策略。 通常就是这样。 1.没有故事板代表通过应用程序的整个流程。 2.每个情节提要板代表应用程序中的单个屏幕,如果需要,则为View Controller。 3.每当您打算重用视图时,请继续使用它自己的nib文件创建一个自定义UIView子类。 4.散步,享受一生中额外的5个小时,因为您不再需要在同一个该死的整体XML文件中解决合并冲突。 当然,如果您做这些事情,您似乎会错过情节提要的关键卖点。 您已经放弃了一个文件可以神奇地向我们展示应用程序所有屏幕上所有用户旅程的想法。 也许这首先是一个误导的愿景。 也许在这样的想法中只存在边际效用,并且一直使用情节提要的人(阅读过实际的开发人员)并没有从中获得任何价值。 您当然可以提出一个案例,即一个情节提要不一定会浮出水面。 通常,注销用户会将用户带到某个开始屏幕,如果您查看情节提要,这并不是很明显。 因此,似乎我们想要的真正工具比我们现有的工具复杂得多。 故事板搜寻器的外观如何? 首先,我认为苹果公司或决定接受这一挑战的任何人都必须承认形势的现实。 不再有理智的开发人员在他们的项目中使用单个故事板。 这样做是因为无法使用源代码管理来处理您的应用程序。 因此,也许有一些单独的开发人员正在执行此操作,但是除非您拥有某种团队,否则项目无法真正快速扩展。 考虑到现实,我们如何改变它? 也许我们可以在真正使用它们时开始提及它们。 故事板,至少是我和我团队使用它们的方式,与其说是故事板,不如说是一个单一屏幕的表示。 因此,我们称它们为屏幕。 屏幕可以连接到其他屏幕。 不同的控制器可以管理如何显示不同的屏幕。 屏幕概念的本质是屏幕与其相邻屏幕的关系。 有了这个想法,我们就腾出了故事板,以表示它们本来应该具有的含义。 遍历应用程序中所有屏幕之间的所有关系时,将得到一个故事板。 作为开发人员,故事板不应该成为您要操纵的东西。 它应该是您在各个屏幕上完成的工作的计算结果,可以在需要时随时查看的高级视图。 这样的工作完成了吗? 并非如此,至少我不能用我微弱的Google搜索能力来分辨。 也许这是在苹果公司秘密进行的。 如果是这样,俗话说,除了拥有蛋糕,我们还可以吃蛋糕。 现在该怎么办? 暂时,实际上已经达成一致,如果要使用情节提要来可视化地设计View Controller,则应将每个View Controller分成自己的情节提要。 这样,如果给定的故事板文件中存在任何合并冲突,则将它们限制在单个View Controller中,而不是整个应用程序中的所有View […]