Swift Package Manager(SPM)是蘋(píng)果最新的官方工具,可以用來(lái)管理 Swift 代碼的分配,它為 Swift 編譯系統(tǒng)集成了自動(dòng)進(jìn)行下載、編譯和連接依賴的過(guò)程。
在此之前我們常用的工具是Cocoapods和Carthage。
支持的平臺(tái)
? macOS
? Linux
? iOS
? watchOS
? tvOS
測(cè)試環(huán)境
系統(tǒng)版本
10.11.5 Beta
Swift版本
Xcode7.3.1(swift 2.2)
Xcode8 beta(swift 3)
檢查當(dāng)前Swift版本是否支持SPM
當(dāng)前默認(rèn)為Xcode7.3.1,查看swift版本
swift -version
Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.31)
Target: x86_64-apple-macosx10.9
swift2.2不支持SPM
swift build
error: unable to invoke subcommand: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build (No such file or directory)
切換到Xcode8
sudo xcode-select -s /Applications/Xcode-beta.app
查看當(dāng)前swift版本
swift -version
Apple Swift version 3.0 (swiftlang-800.0.30 clang-800.0.24)
Target: x86_64-apple-macosx10.9
Swift3支持SPM
swift build
error:: no Package.swift found
這個(gè)error是因?yàn)槲覀冞€沒(méi)有創(chuàng)建SPM的庫(kù)
創(chuàng)建SPM測(cè)試庫(kù)
初始化
在github創(chuàng)建SPMTest測(cè)試庫(kù)
https://github.com/huhuegg/SPMTest.git
clone SPMTest
cd /Users/admin/Swift/SwiftPackageManagerExample/
git clone https://github.com/huhuegg/SPMTest.git
初始化SPMTest library
cd /Users/admin/Swift/SwiftPackageManagerExample/SPMTest
swift package init --type library
Creating library package: SPMTest
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/SPMTest.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/SPMTest/
Creating Tests/SPMTest/SPMTestTests.swift
修改SPMTest
編輯Package.swift
import PackageDescription
let package = Package(
name: "SPMTest"
)
//創(chuàng)建動(dòng)態(tài)鏈接庫(kù)
//let dynamicLibSPMTest = Product(name: "SPMTest", type: .Library(.Dynamic), modules: "SPMTest")
//products.append(dynamicLibSPMTest)
//創(chuàng)建靜態(tài)庫(kù)
//let staticLibExecTest = Product(name: "SPMTest", type: .Library(.Static), modules: "SPMTest")
//products.append(staticLibExecTest)
編輯SPMTest.swift
必須包含init方法,否則使用時(shí)會(huì)遇到 initializer is inaccessible due to 'internal' protection level
public class SPMPublicTest {
public var text = "SPMPublicTest"
public init(text:String) {
self.text = text
}
}
提交并標(biāo)注SPMTest版本
提交編輯后的SPMTest
git commit * -m "init library, add tag 1.0.0"
git push
添加版本號(hào)Tag
此處需要注意: commit && push的時(shí)候local tag默認(rèn)不會(huì)被提交
git tag 1.0.0
git push origin --tags
創(chuàng)建測(cè)試工程
mkdir /Users/admin/Swift/SwiftPackageManagerExample/ExecExampleTest
cd /Users/admin/Swift/SwiftPackageManagerExample/ExecExampleTest
swift package init --type executable
Creating executable package: SwiftPackageManagerExample
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/
將SPMTest庫(kù)導(dǎo)入工程
在Package.swift的dependencies添加SPMTest,并指定版本為1.0.0
import PackageDescription
let package = Package(
name: "ExecExampleTest",
dependencies: [
.Package(url:"https://github.com/huhuegg/SPMTest.git", majorVersion: 1),
]
)
添加測(cè)試代碼
不要在main.swift直接導(dǎo)入SPMTest
創(chuàng)建Test.swift
vi Sources/Test.swift
import SPMTest
class Test {
class func testFunc() {
let spm = SPMPublicTest(text: "SPMTest::SPMPublicTest")
print("testFunc: \(spm.text)")
}
}
修改main.swift
print("## Swift Package Manager Example ##")
Test.testFunc()
編譯
創(chuàng)建測(cè)試工程的時(shí)候使用的類型是executable,所以最后會(huì)生成可執(zhí)行文件
swift build
Cloning https://github.com/huhuegg/SPMTest.git
HEAD is now at 629d483 public
Resolved version: 1.0.0
Compile Swift Module 'SPMTest' (1 sources)
Compile Swift Module 'ExecExampleTest' (2 sources)
Linking .build/debug/ExecExampleTest
如果SPMTest庫(kù)的tag沒(méi)有被提交,在build時(shí)會(huì)遇到錯(cuò)誤
error: No version tag found in (/Users/admin/Swift/example/Packages/SPMTest) package. Add a version tag with "git tag" command. Example: "git tag 0.1.0"
測(cè)試
.build/debug/ExecExampleTest
Swift Package Manager Example
testFunc: SPMTest::SPMPublicTest
回到Xcode
之前所有的操作都沒(méi)有打開(kāi)Xcode編輯器,讓我們回到最熟悉的Xcode吧!
創(chuàng)建Xcode工程
swift package generate-xcodeproj
generated: ./ExecExampleTest.xcodeproj
芝麻開(kāi)門(mén)
open ./ExecExampleTest.xcodeproj

調(diào)試運(yùn)行時(shí)記得選My Mac, 強(qiáng)烈期待iOS iOS iOS~