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一起使用。 互联网上已经有几篇文章如何做到这一点
- 将Xcode与Swift Package Manager结合的3个步骤
- 如何将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的支持,我们需要在Travis上启用项目,并且它将在每次提交或新的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。英国..