
Swift Package Manager(SPM)是蘋果最新的官方工具,可以用來管理 Swift 代碼的分配,它為 Swift 編譯系統集成了自動進行下載、編譯和連接依賴的過程。
在此之前我們常用的工具是Cocoapods和Carthage。
支持的平臺
? macOS
? Linux
? iOS
? watchOS
? tvOS
測試環境
系統版本
10.11.5 Beta
Swift版本
Xcode7.3.1(swift 2.2)
Xcode8 beta(swift 3)
檢查當前Swift版本是否支持SPM
當前默認為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
查看當前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
這個error是因為我們還沒有創建SPM的庫
創建SPM測試庫
初始化
在github創建SPMTest測試庫
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"
)
//創建動態鏈接庫
//let dynamicLibSPMTest = Product(name: "SPMTest", type: .Library(.Dynamic), modules: "SPMTest")
//products.append(dynamicLibSPMTest)
//創建靜態庫
//let staticLibExecTest = Product(name: "SPMTest", type: .Library(.Static), modules: "SPMTest")
//products.append(staticLibExecTest)
編輯SPMTest.swift
必須包含init方法,否則使用時會遇到 initializer is inaccessible due to 'internal' protection level
public class SPMPublicTest {
public var text = "SPMPublicTest"
public init(text:String) {
self.text = text
}
}
提交并標注SPMTest版本
提交編輯后的SPMTest
git commit * -m "init library, add tag 1.0.0"
git push
添加版本號Tag
此處需要注意: commit && push的時候local tag默認不會被提交
git tag 1.0.0
git push origin --tags
創建測試工程
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庫導入工程
在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),
]
)
添加測試代碼
不要在main.swift直接導入SPMTest
創建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()
編譯
創建測試工程的時候使用的類型是executable,所以最后會生成可執行文件
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庫的tag沒有被提交,在build時會遇到錯誤
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"
測試
.build/debug/ExecExampleTest
Swift Package Manager Example
testFunc: SPMTest::SPMPublicTest
回到Xcode
之前所有的操作都沒有打開Xcode編輯器,讓我們回到最熟悉的Xcode吧!
創建Xcode工程
swift package generate-xcodeproj
generated: ./ExecExampleTest.xcodeproj
芝麻開門
open ./ExecExampleTest.xcodeproj
調試運行時記得選My Mac, 強烈期待iOS iOS iOS~