最新消息:iOS编程开发交流群(6906921) ,Mac.Cocoa开发交流群(7758675) 欢迎iOS/macOS开发编程爱好及学习者加入!

Swift Package Manager(SPM)Swift包管理器

iOS 天狐 8119浏览 0评论

引言

很多开发语言都有官方的包管理工具,例如Node.js的 NPM(Node Package Manager)。Cocoa中常用的的非官方第三方是 CocoapodsCarthage 包管理工具。好消息是随着Swift的版本更新,一个官方的包管理工具诞生了!

Swift Package Manager(SPM)

Swift Package Manager Swift包管理器,简称SPM,是一个管理发布Swift代码的工具,它为 Swift 编译系统集成了自动下载、编译和连接依赖的过程。

SPM将在Swift3中发布,当前仅仅在Swift 3开发者预览版中可用

2FE94E7B-5145-4BD0-97D3-53AAA1795DBE

概念概述

本章节描述Swift Package Manager的一些基本概念和功能

模块 Module

Swift使用模块组织管理代码,每一个模块指定一个命名空间并强制指定模块外哪些部分的代码是可以被访问控制的。

一个程序可能在单个模块中拥有所有的代码,或者它可能导入其他模块作为依赖关。除了少数系统提供的模块,如Darwin在OS X和Linux上的Glibc,大部分依赖需要下载并构建代码来使用。

当你使用解决了一个特定问题的单独的模块代码,而且这些代码可以在其他情况下重用。例如,一个模块提供的网络请求功能, 可以使用在共享照片应用和一个天气应用中。使用模块可以让你的代码建立在其他开发者的代码之上,而不是你自己去重复实现相同的功能。

包 Packages

一个包由 Swift 源文件和一个清单文件组成。这个清单文件称为 Package.swift,定义包名或者它的内容使用 PackageDescription 模块。

一个包有一个或者多个 targets,每个targets指定一个product,并且可能声明一个或者多个依赖。

产物 Products

一个targets可能构建成一个库或者一个可执行文件。库包可以含被其他 Swift 代码导入的模块。可执行文件是一个可以被操作系统运行的程序。

依赖 Dependencies

targets的依赖是指包中代码必须添加的模块。依赖由包资源的绝对或者相对 URL 和一些可以被使用的包的版本要求所组成。包管理器的作用是通过自动为工程下载和编译所有依赖,减少协调的成本。这是一个递归的过程:依赖能有自己的依赖,其中每一个也可以具有依赖,形成了一个依赖相关图。包管理器下载和编译所需要满足整个依赖相关图的一切。

下一个章节保证你懂Swift。如果你是Swift新手,你可用访问你的入门的第一个资源 Swift Tour in The Swift Programming Language。如果你想跟上的代码示例,您将需要有一个快速的安装,你可以找到说明Getting Started

使用示例 Example Usage

在在Getting Started,一个简单的““Hello, world!” 程序被建立在包管理器中。

为了了解 SPM 究竟能够做什么,我们来看一下下面这个由四个独立的包组成的例子:

  • PlayingCard - Defines PlayingCard, Suit, and Rank types.
  • FisherYates - Defines an extension that implements the shuffle() and shuffleInPlace() methods.
  • DeckOfPlayingCards - Defines a Deck type that shuffles and deals an array of PlayingCard values.
  • Dealer - Defines an executable that creates a DeckOfPlayingCards, shuffles it, and deals the first 10 cards.

你可以从 Dealer project from GitHub编译并运行完整例子,然后运行如下命令:

创建一个库包 Creating a Library Package

我们将从创建一个代表一副标准的52张扑克牌的模块开始。 PlayingCard 模块定义了 由 Suit 枚举值(Clubs, Diamonds, Hearts, spades)和 Rank 枚举值(Ace, Two, Three, …, Jack, Queen, King)组成的 PlayingCard 类。各个类的核心代码如下:

一般来说, 一个包包括任何位于 Sources/ 的源文件。

由于 PlayingCard 模块并不会生成可执行文件,所以应该称为 。 库表示被编译成一个可以被其他包导入的模块的包。默认情况下,库模块公开所有源代码中声明的公共类型和方法 在 Sources/ 目录中。

运行 swift build 开始启动 Swift 编译的过程。如果一切工作正常,静态库 PlayingCard.a 将会在 .build/debug 目录下生成。

完整 PlayingCard 代码可以在 https://github.com/apple/example-package-playingcard  中被找到。

使用编译配置语句 Using Build Configuration Statements

下一个即将编译的模块是 FisherYates. 与 PlayingCard 不同,这个模块没有定义任何类型.而是, 它扩展了存在的类型 CollectionTypeMutableCollectionType 协议 –增加了  shuffle() 方法和对应的 shuffleInPlace().

shuffleInPlace() 方法的实现使用了 Fisher-Yates 经典洗牌算法来随机交换集合中的元素. 因为Swfit标准库没有提供随机数生成器,该方法需要调用一个从系统模块导入的函数. 。为了使这个方法能够同时适配 OSX 和 Linux, 代码将要用到编译配置语句。

在 OS X, 系统模块 Darwin,提供 arc4random_uniform(_:) 方法. 在 Linux, 系统的模块是 Glibc, 提供 random() 方法:

The complete code for the FisherYates package can be found at https://github.com/apple/example-package-fisheryates.

导入依赖 Importing Dependencies

DeckOfPlayingCards 包把前两个包聚合到一起:它定义了一个在 PlayingCard 数组中使用 FisherYatesshuffle() 方法的 Deck 类型。

为了使用 FisherYatesPlayingCards 模块, DeckOfPlayingCards 包必须在 Package.Swift 清单中将上述模块声明为依赖。

每一个依赖指定一个源地址URL和版本要求,源地址 URL 是指允许当前用户解析到对应的 Git 仓库,版本号要求遵循 语义化版本号 2.0.0 的约定,用来决定检出或者使用哪个 Git 标签版本来建立依赖。对于 FisherYatesPlayingCard 这两个依赖来说, 最新的将要被使用的主版本号为 1 (例如: 1.0.0)。

当运行 swift build 命令时,包管理器将会下载所有的依赖, 并将他们编译成静态库,再把它们链接到包模块中。这样将会使 DeckOfPlayingCards 可以访问它import 语句依赖的模块的公共成员。

你可以看到这些资源被下载到你工程根目录的 Packages 目录下,并且会生成编译products在你工程根目录的 .build 目录下。

包目录包含了所有依赖的克隆源. 这样将使你能修改源代码并直接推送这些修改到第三方的源,而不需要再对每个包在单独进行复制。剩下的步骤参考前面内容。

完整的 DeckOfPlayingCards 包可以在如下地址查看: https://github.com/apple/example-package-deckofplayingcards. 。

解决子依赖 Resolving Subdependencies

到了这, 你可以 build  Dealer 模块.  Dealer 模块依赖于 DeckOfPlayingCards 包, 而该模块又依赖于 PlayingCardFisherYates 包。然而,由于 Swift Package Manager 会自动解决子依赖,所以你需要声明 DeckOfPlayingCards 包作为依赖即可。

对于任意类型在代码中引用Swift 需要在源文件中导入模块 , 在 Dealer模块的 main.swift 文件,DeckOfPlayingCards 中的 Deck 类型和 PlayingCardPlayingCard 类型是引用。虽然 Deck 类型中的 shuffle() 方法使用在 FisherYates 模块内,但是 FisherYates 模块并不需要在 main.swift 中被导入。

按照惯例,一个包在根目录中包含一个叫做 main.swift 的文件生成一个可执行文件。

运行 swift build 命令开始用 Swift 编译来生成可以被运行在 .build/debug 目录下的可执行文件 Dealer

完整的 Dealer 代码可以在如下地址找到 https://github.com/apple/example-package-dealer.

更多关于 Swift Package Manager 信息查看文档: Swift package Manager project on GitHub

社区的建议

最初的Swift Package manager 发行版仅仅是一个开始,如果可能,我们邀请你参与并帮助我们建立更好的工具

为了帮住你开始我们的项目,我们已经准备了以下社区建议提供了目前执行的决定的一些背景,并为未来的功能开发提供方向。如果你有兴趣参与,这是你应该阅读的第一个文件。

https://github.com/apple/swift-package-manager/blob/master/Documentation/PackageManagerCommunityProposal.md

转载请注明:天狐博客 » Swift Package Manager(SPM)Swift包管理器

微信 OR 支付宝 扫描二维码
为天狐 打赏
非常感谢你的支持,哥会继续努力!
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址