Tag: 开源

Azure Logic应用程序,Azure SQL,Azure移动应用程序和Loop(iOS)更好地结合在一起!

自从我上一篇文章以来已经很长时间了! 自那以来,我们发生了很多事情,其中​​包括Sam根据他的Loopkit工具包切换到Nate很棒的Loop应用程序,以及几个月前Pete提供的我们最喜欢的RileyLink董事会! 尽管这对Sam来说是一个巨大的变化(减少了设备携带,并且用户界面更易于管理Loop),但作为父母,我们确实希望了解Loop活动,并且能够在他不在我们身边时获得失败消息,例如在学校。 当我快速学习以了解Loop应用程序所使用的逻辑和算法时,下一个逻辑步骤是将其与我使用Azure Logic Apps,API应用程序和移动应用程序/通知中心为OpenAPS构建的后端Azure集成。 通过在我们的Windows Phone和运行NightScout UWA的Surface上都开始接收消息后不久,简单地增加几行代码,这是一项相当简单的任务。 直到本周,在忠于Windows Phone的11年中,我终于决定切换到iOS之前,一切都很好! 对我来说,主要的阻碍因素之一是无法访问Loop的推送通知,而Pete在NightScout集成方面的出色工作对于让远程监控部件也很不错,我希望也能够在iPhone上获得相同的警报。 这就是“循环跟随”的想法出现的地方! 感谢Azure团队的出色文档,首先,我按照以下指南开始配置自定义移动应用程序以支持Apple Push(在GitHub上!): https://github.com/Azure/azure-content/blob/master/articles/notification-hubs/notification-hubs-ios-apple-push-notification-apns-get-started.md 接下来,我开始了一个简单的Xcode项目,并在这里重用了另一个很棒的Azure指南中的代码: https://github.com/Azure/azure-content/blob/master/articles/app-service-mobile/app-service-mobile-ios-get-started-push.md 最后,为了与我的后端(移动应用程序)完全集成: 我使用了最新版本的Microsoft Azure移动应用程序:iOS SDK 我更新了示例代码并添加了applicationKey(不包括您将从Mobile App中获得401的密钥) class ClientManager {static let sharedClient = MSClient(applicationURLString:“ [您的移动应用程序URL”, applicationKey:“ [您的移动应用程序密钥” ))} 在将应用程序部署到iPhone之后,使用了很棒的Notification Hub 测试发送功能,我发送了测试推送消息以确保一切都能首尾进行: 接下来,我简单地更新了我的两个Logic Apps,并使用Jeff出色的API App更新了Apple Push支持,这真是轻而易举! 一分钟左右,所有消息开始显示在我的iPhone上!

选择第三方库的简短指南(入门)

开源库对我们开发人员来说是个福音,但这不是什么大新闻。 如果选择得当,它们可以节省我们的时间和精力。 我们不必太在意实现细节,维护和功能。 取而代之的是,我们为我们提供了一个简单易用的API,该API可以使我们轻松地到达所需位置。 我不必自己编写QR码扫描仪,而且我敢肯定,再也不会写网络库了。 但是,在为项目选择库时有许多注意事项。 选择维护不善的设备迟早会适得其反。 现在,假设您要实现一个库,并且发现可以根据需要进行自定义的库。 让我们转到Github并导航到您选择的库。 选择开放源代码库时,需要注意以下几点。 该库是否支持依赖项管理器? 依赖管理器使我们的工作变得更加轻松,我什至不记得编码在他们出现之前是怎样的。 在iO上,我最喜欢的是Cocoapods,但迦太基也获得了极大的关注。 不要忘了苹果自己的Swift Package Manager,这肯定会在不久的将来成为现实。 在这里我不会详细介绍它们的工作原理,但是您应该使用它们,相信我。 它们为您处理了很多难题,例如将依赖项集成到您的应用程序中,使它们易于更新,仅举几例。 因此,请确保支持您选择的依赖项管理器。 什么时候是对该仓库的最后一次提交? 一段时间未更新的回购可能不是您的首选。 通常,超过6个月的提交使我感到怀疑,超过1年或更多年的提交实际上使该回购失去资格。 如今,对于iOS来说,这一点尤为重要,因为Swift的发展非常迅速,并且会定期对API进行重大更改。 可能是该库的维护不完善,您需要根据自己的需要来保持它的最新状态。 最后,您可能会更好地寻找替代方案或自己编写替代方案。 话虽如此:除了主服务器,最好检查仓库中的其他分支。 许多开发人员准备将其库与单独分支上即将推出的SDK版本兼容。 一旦发布了新版本,它们将被合并,并且在此之前可以在您的项目中明确使用。 图书馆有几颗星? 如果回购中有大量的星星(和叉子),则通常可以很好地指示其背后有一个庞大的社区。 很难说出“多少”是多少,但现在我要说大约600+。 让我强调一点,我并不是说星数较少的图书馆可能不是最合适的! 我要说的是,数百颗甚至数千颗恒星几乎可以保证这个lib发挥出色,并且在那里有人在乎。 快速发现错误并通过修复做出贡献的人。 有兴趣在自己的项目中不断更新该库的人们。 因此,根据经验:星星越多,您的决定就越有前瞻性。 图书馆有几期? Github问题追踪器是一件方便的事情。 它使您对所有者和社区对图书馆的贡献有一个很好的了解。 让我们看看Alamofire的问题跟踪器,它是Swift中优雅的网络库。 问题通常以三种形式出现:错误,问题或功能请求。 让我们专注于错误和问题: 有一长串未解决的错误 ,其中一些可以追溯到几个月甚至几年? 查看详细信息视图:这些错误对您来说是否有效? 项目成员有什么回应吗? 如果没有,我将决定不使用该库。 是否有很多问题标记为问题 ? 即使它们似乎是关于非常基本的东西? 这可能暗示此lib没有足够的文档记录或使用起来很复杂。 但是,如果快速而又经常地回答问题,那么在仅解决文档问题就无法解决问题时,也可以寻求帮助。 这也导致了下一个问题: 图书馆是否有充分的文献资料? 自述文件是每个Github存储库的登陆页面,第一印象。 […]

扩展和管理开源社区

我已经为开源iOS社区做出了大约一年的贡献,并参与了诸如MessageKit , Moya , SwifterSwift和IBAnimatable 。 这些项目无疑使我成为了一个更好的iOS开发人员,但是影响最大的项目是Moya,即Moya管理社区的方式。 如果您要构建一个相当大,持久且广泛使用的开源项目,则将需要一些额外的帮助。 与维护实际的代码库相比,通过维护示例文档,管理文档以及响应GitHub问题而积累的工作量可能更耗时。 对于成熟的项目尤其如此,因为代码库的更改频率较低。 我想讨论一下我从Moya中学到的教训,以便围绕一个项目建立一个大型社区,以维护该项目。 有同情心 对开源做出的贡献可能会令人恐惧-特别是对于初次贡献者。 人们常常不愿做出贡献,因为害怕受到批评或看上去无所事事。 不言而喻,您绝不应轻视任何贡献或尝试作出贡献。 您的项目应采用的首批文件之一是行为准则。 Moya遵守《贡献者公约》的行为守则。 如果潜在的贡献者正在努力做出贡献,请采取一切必要的措施来帮助他们完成任务,无论是指导他们完成拉取请求过程还是编写补丁的后备单元测试。 重要的是,每个项目都必须有一份有助于指导的文档,该文档讨论项目的开发过程及其对贡献者的期望。 这样可以确保新的贡献者感到舒适,并使贡献尽可能容易。 您应该总是感到受宠若惊,以至于有人足够关心以帮助您改进项目。 您永远不会知道,将来,该贡献者可能最终为您的项目做出一些最重要的贡献。 提供主人翁意识 绝大多数开放源代码项目都由捐赠时间提供支持。 重要的是,人们在帮助构建的东西上要有主人翁感。 我了解到有几种方法可以做到这一点: 将您的项目托管在组织中。 如果您的项目开始越来越引起社区其他成员的认可,则应高度考虑将所有权移交给组织。 这使您可以在项目周围形成社区,并让其成员在其GitHub个人资料上显示组织徽章。 在第一个合并的合并请求之后邀请用户加入您的项目。 莫亚(Moya)采取了这项政策,并取得了奇迹。 目前,该组织有126个成员,所有成员都对该项目具有写权限。 听起来很疯狂,但是我们锁定了master分支,要求通过状态检查和代码审查。 还没有一个问题。 Moya甚至还开发了一种名为Aeryn的工具来自动执行邀请过程。 您可以在此处查看采用Aeryn的其他组织的列表。 不要使用您自己的名称采用项目前缀。 建立成功的项目是团队的努力。 您应该避免使用引用您自己的名称的项目前缀或采用任何其他种类的个人品牌。 它暗示您是该项目的唯一所有者,并减少了其他贡献者的价值。 就个人而言,我不会使用此命名约定来涉及项目。 通过表彰杰出贡献者为核心团队来奖励他们。 所有贡献者都是宝贵的,但是不认识那些特别致力于维护项目和长期健康的人是错误的。 这可以像在GitHub组织内创建核心团队一样简单,也可以通过在正式文档中收集贡献者的姓名来实现。 尽管每个项目都有不同的要求,但您可以参考Moya如何确定核心团队成员及其职责。 分配责任 根据Ash Furrow的说法:…开源维护者应尽早分配其权力和职责。 因为事实是,最终您将准备好进行下一个项目。 作为维护者的目标实际上应该是创建一个对您的兴趣超过其兴趣的项目。 作为一个控制狂,这对我来说很难。 但是,在开发MessageKit时,我真正地了解了这一点的重要性。 最近,我因积极从事该项目而精疲力尽,以至于我停止了将近一个月的捐助。 在我缺席之前,我已经将制作新版本的权力分配给了前两名贡献者,然后返回发现他们已经修复了多个错误,提供了新功能,甚至发布了重要版本。 视力 […]

Plank简介:iOS的不可变模型生成

Rahul Malik | Pinterest技术主管,iOS核心体验 去年,我们的iOS团队全面改革了整个应用程序的体系结构。 这是一项巨大的努力,导致开发人员可以更快地迭代应用程序,更易于扩展,而全球Pinners的应用程序则快3倍。 我们的新系统严重依赖于并发。 UI渲染,图像下载,GIF解码和网络响应处理只是利用多个线程来提高性能的一些领域。 这意味着这些组件使用的对象必须是线程安全的,以避免错误和潜在的崩溃。 由于模型对象几乎遍历我们应用程序的所有组件,因此确保模型层可以安全地跨线程使用非常重要。 为了解决这个问题,我们转到了一个不变的模型层。 不可变对象与可变对象的不同之处在于,一旦创建它们就无法对其进行修改,这从本质上使它们成为线程安全的。 这使开发人员可以编写更易于推理的代码,因为一旦建立不变量就无法更改。 今天,我们是开放源代码的Plank,这是我们为实现此目的而创建的iOS不可变模型生成器。 Plank是用Swift编写的命令行工具,可生成不可变的Objective-C模型。 在本文中,我们将重点介绍一些主要功能以及其创建的动机。 动机 设计和维护模型层可能很繁琐且容易出错。 缺少简单的null检查或尝试序列化包含无法序列化的属性的对象可能会导致未定义的行为和崩溃。 手写模型还可能遭受其实现中的不一致问题,并且在序列化时可能导致不同的行为和策略。 以下是一些由于手写模型问题导致的常见错误和崩溃的示例。 通过Plank生成模型 让我们用这些字段创建一个表示Pin的模型。 定义架构 Plank将模式文件作为输入,因此我们需要创建一个。 这是Pin类型的架构。 您会注意到我们指定了模型的名称及其属性列表。 请注意,该链接指定了一个附加的format属性,该属性指示Plank使用更具体的类型,例如NSURL或NSDate 。 产生模型 假设此架构另存为pin.json我们通过运行plank pin.json生成模型。 下面,我们将重点介绍Plank从您的模式生成的一些功能。 $木板pin.json Plank创建的Pin类接口 您会注意到的第一件事是所有属性都是readonly 。 这使该类不可变,但是它并没有真正的用处,因为我们没有办法用任何值填充Pin的实例。 为了解决这个问题,我们需要一个抽象,它将采用一组值并产生一个不可变的对象。 变异和建造者 通过生成器类执行Plank生成的模型中的变异。 这是构建器模式的直接实现,Plank会为您生成它。 builder类是一个单独的类型,其中包含readwrite属性和一个将创建新对象的build方法。 JSON解析 现在,我们有了一个不可变的模型和一个构建器类来创建新实例。 但是,大多数应用程序不是静态的,并且依赖于从API返回的JSON数据。 这是我们的Pin模型的示例JSON响应。 为了正确处理此响应,我们不仅需要断言响应类型是正确的,而且还需要添加其他逻辑以将链接表示为NSURL的实例。 小心处理null值也很重要,以避免将属性设置为NSNull值或将null传递给需要nonnull参数的API。 这些错误可能导致无法预测的行为和崩溃。 Plank将创建一个名为initWithModelDictionary的初始化方法,该方法处理解析符合您的模式的NSDictionary对象。 序列化 如果要为应用程序建立脱机支持或在应用程序启动期间保留数据,则需要将模型存储到磁盘。 iOS上最常规的解决方法是在每个模型上实现NSSecureCoding 。 […]

使用KeyPath在Swift中进行无缝数据操作

本文是对 KeyPathKit 框架背后思想的详细介绍 。 如果您喜欢您将要阅读的内容,我敦促您看一下图书馆必须提供的所有功能😉 非常感谢 JérômeAlves 向我展示了我将在下面描述的一种方法。 Swift 4引入了一个称为KeyPath的新概念。 它允许开发人员处理特定类型的特定属性。 稍后,他们将能够针对指定类型的对象评估此句柄,以便为其属性获取值: 最重要的是,此过程完全是类型安全的,并且与struct和class都兼容,并且其语法灵活而简洁:您可以使用类型推断(例如\.count将是有效的)并且可以轻松地链接属性(例如\UIView.layer.cornerRadius是有效的KeyPath ) 现在考虑以下示例数据: 用例进行改进 假设我们要过滤掉lastName不是”Webb” 。 使用filter ,我们可以按照以下方式编写: 现在,我们尝试重写此代码,以便使用KeyPath而不是闭包: 呼叫站点看起来已经干净了一些,而且在不关闭的情况下也更易于阅读。 但是最好的还没到。 现在想象一下,我们想要保留其lastName遵循使用正则表达式指定的特定模式的值。 现在,如果我们只想获取名称以”son”结尾的联系人,则可以如下编写: 这种语法看起来确实很干净,并且比闭包可以实现的可读性高。 谓词介绍 让我们回到第一个用例,再次比较两种语法: 第一种语法具有直接使用运算符==的优势,当人们快速浏览代码时,该运算符提供了宝贵的视觉线索。 第二种语法的优点是不需要闭包,这使代码更加简洁。 如果我们将它们的优点结合在第三种语法中怎么办,那将使我们能够编写: 当然,那看起来不错! 👍 那么如何实现呢? 首先要开始的是运算符== 。 在Swift中,我们习惯于在Equatable类型的上下文中定义此运算符。 在这种情况下, ==返回Bool 。 但是完全有可能重写==以使其返回Bool以外的其他值。 为了解决我们的问题,我们将编写一个返回Predicate的重载。 什么是谓词? 您可以将其视为表达对特定类型的值的约束的一种方法。 一旦定义,就可以针对指定类型的特定值评估谓词。 首先,我们定义一个类型来实现KeyPathPredicate : 然后,我们重载==以使其采用KeyPath并且常量具有参数并返回KeyPathPredicate : 最后,我们定义一个与KeyPathPredicate一起使用的filter版本: 而且,瞧,我们现在可以使用目标语法来编写代码🎉 结论 为了使本文的长度合理,我仅考虑了一些基本用例。 但是还有许多其他用例需要讨论。 例如,最好重载运算符~=以便根据正则表达式评估String值。 […]

我一个月内在Github上获得800颗以上星星的方法

本文是根据我发布iOS开源库Sharaku的经验编写的。 这个图书馆一个月内获得了800颗以上的星标。 我没想到这会成为如此受欢迎的项目。 我的期望是在6个月内获得50颗星。starting开始之前,我想确保这就是我在这次体验中的感受,这就是有关轻量级图书馆的故事。 这是我所做的一些步骤。 1.提出想法 首先,我们需要对将作为开放源代码创建一个想法。 我想我们想使图书馆受欢迎。 我们应该提出什么样的想法? 我想我需要在开始编程之前问一些问题。 完成需要多长时间? 我想您有自己的工作,并且不能花这么长时间来从事开源项目。 如果答案不够短。 简化想法可能更好。 对我来说,我可以花的时间只有1或2天。 它有其独特的价值吗? 没有自己价值的图书馆将不会流行。 因此,您需要考虑其他类似库之间的区别。 这就像在思考商业模式。 如果您认为自己的想法满足上述条件,那就开始编程吧! 2.程式设计 对于Sharaku这样的库,简单性很重要。 使用Sharaku,您可以将功能与如下几行代码结合使用。 让vc = SHViewController(image:imageToBeFiltered) vc.delegate =自我 self.present(vc,动画:true,完成:无) 由于我使用了CocoaPods模板,因此它为我提供了直接的文件结构。 这将有助于其他开发人员的维护或贡献。 3.释放 今天,为开发人员共享源代码的唯一方法是Github。 我认为以下两点对于这一步骤很重要。 设计 对于某些开发人员来说,他们不是擅长使用Adobe Illustrator或Sketch.app进行设计。 但是设计对于在Github上吸引明星非常重要,因为共享和传播您的图书馆的人将使用粘贴在Github上的图像或视频。 因此,您需要仔细制作它们。 自述文件 即使您的设计很棒并且库本身很棒,但是如果存储库的README质量很差,人们如何依赖您的库并使用它。 自述文件应涵盖开源库的最低要求。 用法 示例(屏幕截图或视频) 依赖关系和要求 如何安装 执照 4.传播 首先,我使用Facebook和Twitter,因为我的许多朋友都是开发人员。 其次,列出库的Web服务。 就我而言,这是可可粉控件或iOS Cookies。 最后一个Github存储库正在收集有前途的开源库。 在我的情况下,Sharaku被列为超赞。 通过上述渠道在Github上获得超过20或30颗星之后。 […]

开源∝了解更多

一个晴朗的周末,周围到处都是雪,没有阳光……(哦,错过了我住在斯德哥尔摩的消息),我开始在Linkedin上寻找公司如今在有经验的iOS开发人员中寻找的东西,因为我加入了我的公司大约2年前,很长一段时间都没有在Linkedin上浏览过Job。 所以想知道还有什么我不知道并且应该赶上的东西。 令我震惊的是,几乎所有的职位空缺仍在寻找Objective C专家! 我已经在Objective C上构建了4年的iOS应用程序,但是Swift逐渐发展起来后,我和我的队友开始转向Swift,现在距我在Objective C编写任何东西已有2年了。这对我来说非常令人惊讶关于为什么公司不使用Swift并害怕迁移到Swift的原因! 实际上是为了找出答案,我问了一个招聘者这个问题,他说这是因为他们认为用Swift编写应用程序会使应用程序尺寸更大! 我们的应用程序包含大量文件和类,但仍为13MB🤔 然后,有些工作需要对堆栈溢出做出更多贡献。 我可以理解,如果公司想知道您愿意为贡献和分享知识做些什么,但是将其强制性设置则有点奇怪。 我想认为在Stack Overflow上不花很多钱有时是件好事,因为您不是一整天都在寻找问题以试图回答问题并获得一些积分,而是您忙于在办公室工作并试图为票务做贡献和分配给您的故事。 我见过一些人花了30%的工作时间尝试活跃在SO或Twitter上,以便您能获得这些要点,这真的很好吗? 🤔可能在周末或办公时间以外做出贡献是一件好事,但在有报酬做其他事情时却没有。 开源的 最后,我非常重视Github项目,我认为这很棒,因为您可以了解开发人员的实际代码和编码标准,并查看它是否符合您的期望。 这让我想到,如果我的日常工作之外的某个人似乎对我的代码有所了解并进行审查,那么我可能会开始学习不同的东西,并且它的压力可能会使我学到更多。 因此,最终由于这个原因,我开始将周末的业余爱好项目上传到Github。 第一步,我有一个想法,使UICollectionViewLayout更加有用和灵活,而不是仅仅局限于一次,并且在我本地创建了一个项目,我将该项目开源并通过cocoapods公开了-FlexiCollectionViewLayout。 这帮助我学习了依赖项管理器,可可豆荚,Swift软件包管理器和迦太基。 开源之后,我意识到我可以做得越来越好。 现在,这变得令人上瘾了,我有一个包含数十个想法的待办事项清单,我从来没有从事过😣,他们现在正在形成并已开始着手研究。 因此,我的观点是始终关注工作门户网站,看看有什么好趋势将有助于您做得更好,这总是很高兴的。 在私人项目上工作很有趣,如果您坚持日常工作,您将学到一些东西。 不要犹豫,不要担心失败,开源将帮助您改善自己并评估自己的弱点并加以解决。

条件赋值运算符

开发人员通常需要根据可选值构建字典。 当然,在Swift中很容易做到,对吧? 只是[String:Any?],所以为什么写一篇有关它的博客文章? 对于便利的条件赋值运算符,我们将其用作用例之一。 因此,让我们来看一个现实生活项目中的示例-Zonky。 该应用程序显示一个屏幕,您可以在其中选择多个贷款参数以过滤贷款列表。 当然,所有这些参数都是可选的。 为了应用选定的过滤器,我们需要将参数作为字典发送到服务器。 带有字典的过滤功能如下所示: 看来还可以,但是我们不希望字典中出现可选内容,因为Alamofire将[String:Any]作为参数字典的一种类型。 我们该如何解决? 最直接的解决方案非常明显: 很好,它可以工作,但是请想象更大的参数集。 那是很多丑陋而无聊的代码! 👎这就是导致我们了解条件赋值运算符背后的思想的原因。 我们只想为字典分配一个值,除非它不是nil。 Voilà。 更短,更美观,更易读💪但它不是Swift附带的标准运算符,因此让我们看一下它的幕后工作方式。 基本思想很简单-我们只是将第二个示例中使用的展开代码和赋值代码移到了自定义运算符定义中。 就是这样! 我们有一小段代码,这使我们的代码库变得更好。 您不仅可以使用此运算符来构建字典(还有其他甚至可能更聪明的方法来实现此目的),而且只要需要仅在值不为零时才赋值,并且相信我,这是一个很常见的情况,您会喜欢😏 如果您喜欢这个简单的技巧,请参阅我们的ACKategories-轻量级的开放源代码库,其中包含类似的有用工具和扩展,或者仅等待我们的下一篇博客文章,我们将为您展示更多来自厨房的食谱👨‍🍳 … 最初于 2018 年6月4日 发布在 www.ackee.cz 上。

2017年3月:四个新的GitHub开源iOS库

我们每月的GitHub摘要又回来了,今天我们在谈论新的Swift和Objective-C库,这些库可以简化iOS开发人员的工作。 上帝之眼 斯威夫特,本月约2千颗星 GodEye是Swift库的开源集合,可让您自动显示日志,崩溃,网络,CPU,RAM和网络信息等。 它具有非常全面的结构,包含多个子项目。 甚至有一本关于这个巨大的实用工具的开发过程的书。 需要明确的是,这本书是中文的,但这是个好主意。 编写一行代码就足以在您的项目中实现GodEye。 GodEye不仅包括用于监视您的应用程序的库,还包括用于显示信息的用户界面。 何时使用: 当您想以方便的格式显示所有调试信息时。 以及更多:2017年3月:四个新的GitHub开源iOS库

Vapor APT 2.0 —拥抱开源

我们很早就决定建立一个APT存储库,以使人们可以轻松地在Linux上安装Swift和我们的Vapor Toolbox。 长期以来,它很快就被构建起来,但是它的确意味着很难维护。 展望未来,我们最近发布了APT 2.0版。 它是完全开源的,能够使我们的社区更紧密地融入流程。 我们是一家非常注重开源的公司,主要是因为我们的公司基于开源。 这也确实意味着我们拥有社区构建工具,这些工具可以从我们在APT上的工作中受益,并将工具放置在同一位置。 为了简化此过程,所有软件包现在都位于GitHub上,并且一旦批准,我们将使用CI系统在APT上构建新版本。 这个过程很简单。 用户在新的PullRequest中将基于某些模板的包推送到GitHub。 为了确保我们保持安全性,管理员需要进入并查看PR。 如果获得批准,则管理员只需向PR回复/approved ,之后,我们将运行一个Jenkins实例,它将获取更改,并启动一个Vapor CLI应用程序,该应用程序负责构建APT。 完成后,Jenkins将通过我们的vapor-ci-robot用户进行报告,并提供状态和日志链接 我们当然要添加很多东西,其中一项是我们现在正在构建的,并且令人兴奋的是,该工具可以自动测试新PR的建立和设置是否正确,这意味着我们将在沙盒环境中进行构建和设置。 完成所有工作后,管理员便可以批准该应用程序,知道是否一切正常。 我们还计划能够构建到目标操作系统。 这将为自动构建系统增加更多的灵活性。 只需访问http://github.com/vapor/apt,这里还有有关如何通过Linux上的APT安装Swift和Vapor的文档。 APT只能用于安装Swift,因此它不仅意味着可以与Vapor一起使用,而且还可以与其他服务器端Swift框架一起使用。