[ WWDC2018 ] - 了解Swift Package Manager Getting to Know Swift Package Manager

Getting to Know Swift Package Manager

概述

Swift Package Manager(簡(jiǎn)稱SPM)佑附,是Apple官方提供的軟件包管理器,類比如Ruby的RubyGems, Python的pip栈源。開(kāi)源框架里知名度較高的SwiftyJSONSQLite.swift等都已支持SPM集成匹摇。

WWDC18專門開(kāi)了一個(gè)Session介紹了SPM的內(nèi)部結(jié)構(gòu)婆跑、基本使用及設(shè)計(jì)理念,并介紹了之后即將支持的一些新特性魏割。

為什么要使用SPM

  • 最重要的一點(diǎn):官方支持
    官方支持譬嚣,保證了所有Swift軟件包的可信來(lái)源和通用標(biāo)準(zhǔn)。同時(shí)钞它,SPM作為Swift項(xiàng)目的一部分拜银,Apple在Swift工具鏈中提供了更強(qiáng)大的原生支持。

  • 跨平臺(tái)構(gòu)建
    SPM是一個(gè)跨平臺(tái)方案遭垛,SPM提供了完整的構(gòu)建環(huán)境尼桶,能在不同平臺(tái)上來(lái)構(gòu)建和分發(fā)Swift軟件包。

  • 和Swift更緊密的關(guān)系
    SPM采用Swift編寫锯仪,可以使用Swift自身的強(qiáng)大特性疯汁,并且與Swift的核心庫(kù)緊密聯(lián)系。

  • SPM有更先進(jìn)的設(shè)計(jì)
    這個(gè)我們?cè)诤竺嬲鹿?jié)展開(kāi)卵酪。

  • SPM的社區(qū)影響范圍日益增長(zhǎng)
    作為Swift開(kāi)源項(xiàng)目的一部分幌蚊,社區(qū)的熱度不斷升溫谤碳,CocoaPods的眾多核心成員也參與架構(gòu)設(shè)計(jì),影響力越來(lái)越大溢豆。

SPM基本用法

SPM的基本概念可參見(jiàn)官網(wǎng)描述蜒简。

常用命令

  • swift build: 編譯Package。
  • swift run: 編譯Package里的可執(zhí)行文件并運(yùn)行漩仙。
  • swift test: 運(yùn)行Package里的單元測(cè)試搓茬。
  • swift package: 這個(gè)命令的用法很多,Package的初始化队他、修改卷仑、更新、resolve檢查麸折、編譯選項(xiàng)指定等锡凝。

內(nèi)部結(jié)構(gòu)

對(duì)于一個(gè)Package來(lái)說(shuō),主要分為三部分垢啼,Target窜锯、Products、Dependencies.

package.png

  • Products
    Products可以理解為Package輸出的形態(tài)芭析。對(duì)比與Cocoapods只能以靜態(tài)庫(kù)/動(dòng)態(tài)庫(kù)形式锚扎,SPM還可以輸出為可執(zhí)行文件。

  • Target
    Target理解為包含多個(gè)文件的一個(gè)模塊馁启,target之間是可以有依賴關(guān)系驾孔,同時(shí),輸出的Products也會(huì)依賴一個(gè)或多個(gè)target惯疙。

  • Dependencies
    Dependencies描述了當(dāng)前的package需要依賴其他package助币。

一個(gè)典型的Package目錄如下:

example-package-playingcard
├── Sources
│   └── DeckOfPlayingCards
│       ├── DeckOfPlayingCards.swift
│       ├── Rank.swift
│       └── Suit.swift
└── Package.swift

其中Package.swift的定義:

let package = Package(
    name: "DeckOfPlayingCards",
    products: [
        .library(name: "DeckOfPlayingCards", targets: ["DeckOfPlayingCards"]),
    ],
    dependencies: [
        .package(url: "https://github.com/apple/example-package-fisheryates.git", from: "2.0.0"),
        .package(url: "https://github.com/apple/example-package-playingcard.git", from: "3.0.0"),
    ],
    targets: [
        .target(
            name: "DeckOfPlayingCards",
            dependencies: ["FisherYates", "PlayingCard"]),
        .testTarget(
            name: "DeckOfPlayingCardsTests",
            dependencies: ["DeckOfPlayingCards"]),
    ])

Sources目錄下的文件不需要顯示聲明,SPM會(huì)自動(dòng)導(dǎo)入螟碎,Dependencies依賴了兩個(gè)外部Package, 其中Target的依賴既有Package內(nèi)部Target的依賴也有外部Target的依賴迹栓。

Package.resolved被放在頂層包的一個(gè)文件中掉分,類似于許多軟件管理器lock的實(shí)現(xiàn),swift使用該文件來(lái)做依賴關(guān)系解析克伊。在執(zhí)行swift build swift test swift package generate-xcodeproj命令時(shí)酥郭,默認(rèn)會(huì)隱式調(diào)用swift package resolve檢查依賴版本是否正確。
Package.resolved的詳細(xì)設(shè)計(jì)思路可以參考提案愿吹。

SPM的設(shè)計(jì)思想

SPM的設(shè)計(jì)思想也遵循了Swift的一些設(shè)計(jì)思想:

  • 安全: SPM的編譯環(huán)境是在一個(gè)獨(dú)立的沙盒里不从,無(wú)法任意執(zhí)行命令和腳本。

  • 快速: 得益于新的llbuild構(gòu)建系統(tǒng)犁跪,SPM可以支持?jǐn)?shù)百萬(wàn)節(jié)點(diǎn)的關(guān)系依賴圖椿息。

  • 表現(xiàn)力: 采用Swift作為SPM的配置描述語(yǔ)言歹袁。

下圖描述了Apple對(duì)SPM的大體思想:


1 (2).png

Configuration

相對(duì)于Cocoapods等笨重啰嗦的DSL語(yǔ)法,SPM采用了Swift來(lái)作為SPM的配置描述語(yǔ)言寝优,大大降低了開(kāi)發(fā)人員的學(xué)習(xí)成本同時(shí)保留的Swift強(qiáng)大的語(yǔ)言特性条舔,并可以得到 Swift相關(guān)工具的支持。

Dependencies

SPM使用git tag來(lái)做版本依賴乏矾,格式上遵循Semantic Versioning.

Semantic Versioning(Semver): 是為了解決軟件包管理器中著名的Dependency hell問(wèn)題而設(shè)計(jì)的一套簡(jiǎn)單的規(guī)則和條件來(lái)約束版本號(hào)配置的解決方案孟抗。
Semver規(guī)定格式里分為:主版本號(hào).次版本號(hào).修訂號(hào),版本號(hào)遞增規(guī)則如下:
1. 主版本號(hào):當(dāng)你做了不兼容的 API 修改钻心。
2. 次版本號(hào):當(dāng)你做了向下兼容的功能性新增凄硼。
3. 修訂號(hào):當(dāng)你做了向下兼容的問(wèn)題修正。
Semver同時(shí)支持語(yǔ)義化關(guān)鍵字來(lái)實(shí)現(xiàn)版本控制捷沸,需要對(duì)Semver更深入了解的讀者可參考[官網(wǎng)介紹](Semantic Versioning)摊沉。下圖就是一個(gè)采用Semver版本控制的Package依賴樹(shù)結(jié)構(gòu)。

semfer.png

Building

SPM采用了swift-llbuild ,一個(gè)并行亿胸、高效坯钦、增量編譯的構(gòu)建系統(tǒng)作為其構(gòu)建引擎。目前Xcode9也已集成侈玄,用作對(duì)LLVM婉刀、Clang及Swift的構(gòu)建。同時(shí)序仙,因?yàn)楠?dú)立沙盒的構(gòu)建環(huán)境突颊,SPM提供了很強(qiáng)的安全性。

Workflow Features

如果你的某個(gè)軟件包還處于開(kāi)發(fā)模式下潘悼,tag的集成方式很不方便律秃,類似于Cocoapods的做法,SPM也會(huì)提供分支依賴本地依賴做法治唤。

Tools Evolution

和Cocoapods一樣棒动,當(dāng)我們的軟件包需要依賴特定的swift版本,需要在配置描述里顯示聲明宾添。聲明的枚舉類型如下

/// Represents the version of the Swift language that should be used for
/// compiling Swift sources in the package.
public enum SwiftVersion {
    case v3
    case v4
    case v4_2

    /// User-defined value of Swift version.
    ///
    /// The value is passed as-is to Swift compiler's `-swift-version` flag.
    case version(String)
}

例如指定版本為4.0

// swift-tools-version:4.2

import PackageDescription

let package = Package(
    name: "HTTPClient",
    ...
    swiftLanguageVersions: [.v4, .v4_2]
)

SPM的未來(lái)新特性

  • 與其他工具的更好的集成
    使用libSwiftPMlibSyntax對(duì)SPM做更靈活的擴(kuò)展實(shí)現(xiàn)船惨。
  • 發(fā)布和部署
    目前的發(fā)布流程依賴于手動(dòng)建立git tag, git push origin [tag name] 的做法,之后會(huì)有更自動(dòng)化的工具實(shí)現(xiàn)缕陕。
  • 支持復(fù)雜的Packages
    對(duì)資源文件的支持粱锐,更復(fù)雜的編譯設(shè)置,和擴(kuò)展的編譯工具等
  • 更好的管理Package生態(tài)
    跨平臺(tái)的沙盒隔離扛邑、更安全的校驗(yàn)方案怜浅,支持fork操作和搜索索引等。
預(yù)見(jiàn)到等到合適的時(shí)機(jī)蔬崩,SPM成為Swift Package的標(biāo)準(zhǔn)管理工具是大勢(shì)所趨恶座。

參考:
https://developer.apple.com/videos/play/wwdc2018/411/
https://swift.org/blog/swift-package-manager-manifest-api-redesign/
https://medium.com/xcblog/apple-swift-package-manager-a-deep-dive-ebe6909a5284

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搀暑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奥裸,更是在濱河造成了極大的恐慌险掀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湾宙,死亡現(xiàn)場(chǎng)離奇詭異樟氢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)侠鳄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門埠啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人伟恶,你說(shuō)我怎么就攤上這事碴开。” “怎么了博秫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵潦牛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我挡育,道長(zhǎng)巴碗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任即寒,我火速辦了婚禮橡淆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘母赵。我一直安慰自己逸爵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布凹嘲。 她就那樣靜靜地躺著师倔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪周蹭。 梳的紋絲不亂的頭發(fā)上趋艘,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音谷醉,去河邊找鬼。 笑死冈闭,一個(gè)胖子當(dāng)著我的面吹牛俱尼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萎攒,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼遇八,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矛绘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起刃永,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤货矮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后斯够,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體囚玫,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年读规,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抓督。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡束亏,死狀恐怖铃在,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碍遍,我是刑警寧澤定铜,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站怕敬,受9級(jí)特大地震影響揣炕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赖捌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一祝沸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧越庇,春花似錦罩锐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至桑驱,卻和暖如春竭恬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熬的。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工痊硕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人押框。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓岔绸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盒揉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1晋被、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,980評(píng)論 3 119
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件刚盈、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 禮山蘋果酒農(nóng)場(chǎng)位于韓國(guó)蘋果主產(chǎn)區(qū)羡洛,有40年的歷史,前期學(xué)習(xí)日本采用勞動(dòng)密集型的精細(xì)化管理藕漱,近年來(lái)轉(zhuǎn)型為依賴機(jī)械化的...
    柿事如意喜柿多閱讀 761評(píng)論 0 0
  • 一個(gè)人的世界大不過(guò)他的眼界欲侮; 一個(gè)人的成就大不過(guò)他的夢(mèng)想。 徒步谴分,我已經(jīng)不陌生了锈麸,曾參加過(guò)三次。 那時(shí)候我還只有1...
    吳榮常閱讀 721評(píng)論 0 5
  • 今天我要給大家分享的書(shū)是《身份的焦慮》牺蹄。 古人云:倉(cāng)廩實(shí)而知禮節(jié)忘伞,衣食足而知榮辱∩忱迹縱觀現(xiàn)代氓奈,衣食無(wú)憂而愁身份,生活...
    穆思心語(yǔ)閱讀 434評(píng)論 0 0