Apple Swift套件管理员:深入研究

苹果已经发布了自己的软件包管理器,称为“ Swift Package Manager”,以共享和分发Swift软件包。 很高兴知道Apple正在努力替代iOS开发世界中当前最受欢迎和最讨厌的软件包管理器,即CocoaPodsand Carthage。 在本文中,我们将介绍软件包管理的基础知识,并深入研究iOS中的软件包管理,尤其是Swift Package Manager。

当前的iOS软件包管理器

大多数现代语言都带有用于代码分发的官方解决方案,例如Ruby的RubyGems,PHP的Composer,NodeJS的NPM。 在iOS开发环境中,开发人员必须依赖第三方依赖项管理工具,例如CocoaPods和Carthage。 iOS中的程序包管理器还有另外一项工作,即在下载之上构建代码。 在动态框架的情况下,程序包管理器应该能够下载并构建框架。 您可以在此处阅读有关iOS静态和动态库的更多信息。 让我们简要地看看它们是如何工作的。 我们将使用’SwiftyJSON’这是非常流行的Swift库来解析JSON作为示例。

可可豆

CocoaPods作为Ruby库提供,需要作为RubyGem安装。 CocoaPods是使用Ruby构建的,并且可以使用OS X上可用的默认Ruby安装。

  $ sudo gem install cocoapods 

可以使用“ pod init”命令初始化CocoaPods,该命令将创建模板Podfile,但我们可以创建自己的简单“ Podfile”。 典型的“ Podfile”将如下所示

 平台:ios,“ 8.0” 
  use_frameworks! 
 以“ MyApp”为目标 
  pod'SwiftyJSON','〜> 2.3' 
 结束 

现在,我们可以使用魔术命令下载依赖项

  $ pod安装 

CocoPods和Xcode

上面的命令(pod安装)非常神奇,它可以对我们的Xcode项目进行很多更改。 在大多数情况下,很难理解发生了什么变化。 这可能是大多数开发人员讨厌CocoaPods的原因。 CocoaPods对Xcode进行了以下更改。

  • .xcworkspace文件(.xcodeproj顶部的另一个文件,用于打开项目)
  • Podfile.lock(CocoaPods的锁定版本)
  • “ Pods”目录(目录包含Pod依赖项的源代码)
  • Xcode设置中有很多东西!

现在,我们必须使用.xcworkspace打开项目以导入您的依赖项,否则CocoaPods无法正常工作。

CocoaPods的优缺点

使用CocoaPods具有以下优点和缺点

优点

  • 易于安装和使用。
  • 自动为项目执行所有Xcode设置。
  • 社区和支持得到了很好的发展:它拥有最大的社区,几乎每个开源iOS库都得到官方的支持。

缺点

  • 它是Ruby,我们必须管理Ruby依赖项,例如Bundler,Gems等
  • 不了解更改内容的CocoaPods更新Xcode项目和文件就像魔术一样
  • 集中
  • 由于涉及依赖项的两步过程,因此无法同时使用框架和项目。

迦太基

迦太基是Cocoa应用程序的另一个简单的依赖项管理器。 它下载并构建依赖关系,但不会更改项目文件或Xcode项目构建设置(如CocoaPods)。 我们必须手动拖动’。 框架的二进制文件到“链接的框架和库”。

我们可以使用HomeBrew安装Carthage

  $酿造安装迦太基 

现在我们可以使用迦太基了。 如上所述,我们需要使用迦太基获取“ SwiftyJSON”,然后创建具有以下内容的名为“ Cartfile”的文件。

github“ SwiftyJSON / SwiftyJSON”

现在,我们已经在“ Cartfile”中指定了依赖项,运行

$迦太基更新

这会将依赖项提取到Carthage / Checkouts文件夹中,然后构建每个。 现在,CocoaPods的所有功能都可以像魔术一样自动完成,我们已经手动完成了。

在应用程序目标的“常规”设置选项卡上的“链接的框架和库”部分中,将要使用的每个框架从磁盘上的Carthage / Build文件夹中拖放。 对于App Store提交错误,也有一些解决方法,您可以在迦太基自述文件中阅读该方法。 完成所有手动工作之后,我们应该能够导入依赖项。

迦太基和Xcode

迦太基不会触摸Xcode设置或Project文件。 迦太基非常简单,只需签出并构建依赖项,然后将其交给您即可将二进制文件添加到Xcode中。 它使您可以完全控制我们要添加到Xcode中的内容。

迦太基利弊

迦太基有一些优点和缺点

优点

  • 迦太基不会触摸您的Xcode设置或项目文件。 它只是下载并构建依赖项,因此您可以适当地控制自己在做什么。
  • 去中心化
  • 支持子模块

缺点

  • 不稳定而缓慢
  • 小社区,贡献者不多
  • 在Xcode上执行许多手动步骤即可完成所有设置

为什么选择Swift Package Manager

如前所述,每种现代编程语言都提供了官方的依赖管理系统,因此Apple宣布了“ Swift”,并且他们正在开发它的官方软件包管理器,以替代CocoaPods和Carthage。 您绝对应该考虑在Swift项目中使用Swift Package Manager,因为

  • 它是Swift的官方软件包管理器

Swift Package Manager将成为Swift软件包的可信赖来源,以便开发人员可以不用担心地使用它。

  • 由Apple管理

我们已经看到CocoaPods和Carthage都有优点和缺点,并且都由开源社区或第三方公司管理。

  • 未来

它仍处于主要开发阶段,但随着越来越多的人参与进来,随着社区的发展,它迟早会发展。 如果您的项目是100%Swift,那么您绝对应该考虑使用Swift Package Manager作为依赖项管理器。

  • 服务器端

Swift是一种服务器端语言,Swift Package Manager有望在Linux和macOS上运行。 使用macOS构建和分发Swift软件包不会受到任何限制。

迅捷软件包管理器

Swift Package Manager是用于管理Swift代码分发的工具。 它与Swift构建系统集成在一起,以自动化下载,编译和链接依赖项的过程。 他们将Swift Package Manager定义为

“ Swift软件包管理器是用于管理Swift代码分发的工具。 它与Swift构建系统集成在一起,以自动化下载,编译和链接依赖项的过程。”

SwiftPM不仅是程序包管理器,还是构建和测试工具。 Swift Package Manager也可以在Linux和macOS上运行。 Swift Package Manager是

  • 基于命令行的工具
  • 作为跨平台的,Swift Package Manager不需要Xcode即可创建软件包
  • 去中心化
  • Swift Package Manager是开源的,源代码可在Github上获得

Swift软件包管理器设置

如果我们在macOS或Linux上安装了Xcode 8.0或Swift3,则已经安装了Swift Package Manager。 随着Swift成为服务器端,我们可以在Docker容器(如IBM Swift3 Ubuntu Docker映像)上构建它来构建Swift包。 检查Swift版本

  $ swift —版本 

这将为我们提供已安装的Swift版本。 Swift版本应为3,以安装Swift Package Manager。 要检查是否已安装Swift Package Manager,请从终端运行“ swift build –version”。 它应该打印这样的东西

  $ swift build —版本 
  Apple Swift套件管理员-Swift 3.0.1(swiftpm-11504) 

这表示已安装Swift Package Manager并可以使用。

什么是Swift Package?

基本上,Swift软件包是源文件的集合,以库的形式分发,以便其他开发人员可以使用它。 Swift Package Manager创建“ Sources”目录以将所有库代码放入其中,“ Source”内部的每个目录均成为模块。

Swift Package Manager基本上是

  • 模块集合(目标)
  • 模块是可以在macOS和Linux上构建的源和测试目录的集合。
  • 模块可以具有3种基本类型:库(不带main.swift的源文件),可执行文件(带main.swift的源文件)和系统模块。
  • 我们可以在“ package.swift”文件中使用其他现有依赖项来构建程序包。

SwiftPM命令

SwiftPM几乎没有用于设置,构建和测试Swift软件包的命令。 最常用的命令是

  • 快速包装
  • 快速构建
  • 快速测试

Swift软件包命令

Swift Package具有以下命令来初始化项目,获取依赖项,更新依赖项或生成Xcode项目。 软件包具有类型,例如库,可执行文件或系统软件包。

我们可以通过运行“ swift package –help”命令列出所有可用选项

  $快速包装-帮助 

这将列出所有可用于“ swift软件包”的命令

使用模板代码创建新软件包

为了创建库包,我们可以运行

  $ swift package init —类型=库 

获取依赖项代码

同样,我们可以初始化“可执行系统”程序包。 Swift软件包具有用于获取依赖项或更新依赖项的命令。 这将在“ Packages”目录中签出源代码并进行更新。

#从Package.swift获取软件包

  $快速打包获取 

#更新软件包的源代码

  $ swift软件包更新 

生成Xcode项目

Swift Package具有从源代码生成Xcode项目的命令,因此我们可以使用Xcode进行自动补全等

  $ swift包generate-xcodeproj 

这将创建xcproj文件以Xcode打开项目。

  $快速建立 

Swift build命令用于在“ Sources”目录中构建和编译所有Swift文件。 它创建放在“ .build /”目录中的构建。 我们可以使用’swift build –help’列出所有可用的选项。

快速测试

Swift测试命令用于运行“ Tests”目录中的所有测试。 我们可以使用“快速测试–帮助”列出所有选项

创建模板Swift软件包[库模块]

让我们看看swiftPM命令的作用。 我们已经创建了“ Greeter”目录并执行了命令。 如果执行以下命令,则可以发布默认的“ Hello World”软件包。

  $ mkdir Greeter 
  $ cd问候者 
  $ swift —版本 
  $ swift package init —类型=库 
  $快速建立 
  $快速测试 

在这一阶段,我们应该准备好默认的“ Hello World”软件包。 让我们看看这个动作

发布Swift软件包

要发布软件包,我们需要将其推送到GitHub帐户。 假设我们已经安装了git。 用您的用户名和软件包名称替换。 Swift软件包使用语义版本控制对软件包进行版本控制。

  $ git init 
  $ git commit -am“发布Swift软件包” 
  $ git remote add origin git@github.com:YOUR_GITUSERNAME / PACKAGE_NAME.git 
  $ git push origin master 
  $ git标签v1.0.0 
  $ git push origin v1.0.0 

恭喜!! 我们已经发布了我们的第一个Swift软件包。 可以在Github上找到已发布的软件包。

添加Swift依赖项

这是SwiftPM模板创建的默认“ Hello World”包,我们已经执行了所有命令,包括生成Xcode项目。 现在,让我们将SwiftyJSON作为依赖项添加到“ package.swift ”文件中。 该文件应如下所示

 导入PackageDescription 
 让包=包( 
 名称:“ Greeter”, 
 依赖项:[ 
  .Package(网址:“ https://github.com/SwiftyJSON/SwiftyJSON.git”,majorVersion:3,次要:1) 
  ] 

我们将使用fetch命令下载SwiftyJSON依赖项。

  $快速打包获取 

现在,我们应该在“ Packages”目录中检出SwiftyJSON依赖项。 现在我们可以在项目中使用

 导入SwiftyJSON 

Swift软件包目录结构

Swift包具有特定的目录结构以组织Swift代码。 它将所有程序包代码放入“ Source”目录中,并将测试代码放入“ Test”目录中。 一旦我们初始化了swift包,它将使用’Sources’,’Test’和’package.json’文件创建基本的目录结构。

提取,构建并生成Xcode项目后,创建其他目录

  • swift package fetch =>’Packages’目录
  • swift build =>’.build’目录
  • swift包generate-xcodeproj => YOUR_APP.xcodeproj。

我们上面的Greeter示例,现在看起来像这样!

Swift软件包管理器和Xcode

我们刚刚看到,Swift软件包管理器可以为我们生成Xcode项目,但是它涉及许多步骤,以使一切都可以与Xcode一起使用。 互联网上已经有几篇文章如何做到这一点

  1. 将Xcode与Swift Package Manager结合的3个步骤
  2. 如何将Xcode与Swift Package Manager结合使用

但是,在构建Swift软件包时,由于Swift是服务器端语言,因此不需要Xcode。 您应该能够使用基于Linux的轻量级编辑器,例如VIM,Nano等,但另一方面,您会错过自动补全功能和一些重要的Xcode功能。 基本上,使用IDE是每个人的个人选择。

创建另一个Swift包[可执行模块]

现在,让我们创建一个简单的Swift可执行程序包,该程序包使用’SwiftyJSON’库解析JSON字符串。 让我们开始通过命名我们要调用该包的目录来创建目录。 我将其称为“ MyCity”并使用可执行文件类型初始化Swift包。

  $ mkdir myCity 
  $ cd myCity 
  $ swift package init —键入可执行文件 

现在,我们已经完成了所有项目的设置,让我们将SwiftyJSON依赖项添加到我们的“ package.swift”文件中

  $ vim package.swift 

然后添加以下Swift代码

 导入PackageDescription 
 让包=包( 
 名称:“ MyCity”, 
 依赖项:[ 
  .Package(网址:“ https://github.com/SwiftyJSON/SwiftyJSON.git”,majorVersion:3,次要:1) 
  ] 

让我们使用下载

  $快速打包获取 

我们在“ Packages”目录中签出了SwiftyJSON源代码。 让我们在“ Sources / main.swift”文件中使用它。 让我们编辑该文件

  $ vim来源/main.swift 

现在,我们将添加以下代码,这些代码从JSON打印城市名称。

 导入SwiftyJSON 
 进口基金会 
  let mycity =“ {\” city \“:\”伦敦\“}” 
 如果让city = mycity.data(使用:String.Encoding.utf8,allowLossyConversion:false){ 
  let json = JSON(数据:城市) 
 打印(json [“ city”]) 
}

现在,我们将构建软件包并从命令行执行它。

  $快速建立 
  $ ./.build/debug/MyCity 

这应该将“伦敦”打印为我们的城市。

生成Xcode项目

我们可以在VIM或等效的编辑器中编写代码,但是如果您不能没有Xcode,那么我们可以使用简单的命令为Swift包创建Xcode项目

  $ swift包generate-xcodeproj 
  $打开MyCity.xcodeproj 

这将在Xcode中打开我们的Swift包。 现在我们可以使用Xcode的出色功能,例如自动补全,语法高亮显示等

设置Xcode使其与Swift Package完全兼容的步骤很简单。 请按照本文操作,以使Xcode和Swift Package Manager一起工作。

现在,我们已经完成了第一个Swift软件包。 让我们对其进行标记并将其发布在Github上。

  $ git标签v1.0.0 
  $ git push origin v1.0.0 

恭喜!! 我们已经发布了另一个Swift软件包。 可以在Github上找到已发布的软件包。

向Swift软件包添加持续集成

最好在我们的开源Swift软件包中添加免费的持续集成,以确保代码更改不会破坏任何内容。 幸运的是,TravisCI为您在Github上的所有开源项目提供免费服务。 您需要使用Github注册并添加存储库。 您只需要在项目的根目录添加“ .travis.yml”文件。 让我们将.travis.yml添加到上面的Greeter示例包中,内容如下。

 操作系统: 
  -osx 
 语言:通用 
  sudo:必填 
  dist:可信赖 
  osx_image:xcode8 
 脚本: 
-快速构建
-快速测试

现在,我们增加了对TravisCI的支持,我们需要在T​​ravis上启用项目,并且它将在每次提交或新的Pull请求之后“构建”和“测试”我们的项目。 我们的Greeter示例的Travis项目示例可以在这里找到

查找其他Swift软件包

不幸的是,还没有官方的集中化地方可以找到Swift Packages。 如果Swift库与Swift Package Manager兼容,我们需要在Github上找到它。 这是当前可用软件包的列表,但是以这种方式查找软件包很疯狂。 让我们希望苹果公司能够为托管Swift Packages集中一些东西。 有一些第三方公司,例如IBM正在研究Server Side Swift,以及包含一些Swift软件包的IBM软件包目录。 在其他几个地方,您可以查找软件包,例如libraries.io或在CocoaPods上搜索(如果它们还支持Swift Package Manager)。

但是,第三方是第三方,并不可靠。 我们希望苹果将为所有Swift Packages集中托管。

从CocoaPods / Carthage迁移到SwiftPM

如果要将现有的包管理器CocoaPods或Carthage迁移到Swift包管理器,则好的起点是

  • 开始分析依赖项,看看它们是否支持Swift Package Manager,大多数受欢迎的项目都应该支持Swift Package Manager,因此可以随时将其添加到“ package.swift”文件中
  • 将现有的源代码结构更改为SwiftPM 目录结构,并将所有目标组织为模块。
  • 从CoacoPods迁移将很棘手,但是在Github上有一个很好的项目“ schoutedenapus”将现有CocoaPods规格文件转换为“ package.swift”文件。 这将是一个很好的起点。
  • 从Carthage迁移应该相当容易,因为它不涉及任何Xcode文件或项目设置。

您应该开始考虑迁移,因为这将是iOS依赖性管理的未来。 稍后,您必须这样做。

在哪里寻求支持?

  • 官方网页

Apple有开源的Swift,并且有Swift Package Manager的官方网页,所有重要的更新/文档都可以在此处找到。 仍然可以在这里找到社区建议。

  • Github

Swift软件包管理器的源代码在Github上可用。 我们可以随时关注最新动态和问题。 如果有任何问题,请创建问题

  • 邮件列表

有一个正式的邮件列表Swift-Build-Dev,由Swift Package Manager的开发人员和用户参与。

  • IRC和松弛

有Slack组的Swift Package Manager贡献者,请在这里加入。 如果您使用IRC,那么我认为没有人反对在#swift-lang频道中提问

接下来是什么 ?

现在是时候从现有的依赖项管理系统继续进行,开始查看Swift Package Manager是否支持您的依赖项。 如果您仍然担心Swift Package Manager是否已准备好用于生产应用程序,请在试点项目上尝试使用它,或者继续使用当前的依赖项管理器,直到完全采用Swift Package Manager。 期待听到您对Swift Package Manager的看法!

最初发布在我的个人博客上:XCBlog在这里

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..