Swift Package Manager是苹果自家的包管理工具,他和iOS开发中的Cocoapod或者Carthage类似,但是我们可以从他GitHub文档看到
Note that at this time the Package Manager has no support for iOS, watchOS, or tvOS platforms.
就是SPM是不支持 iOS, watchOS, or tvOS 平台,不过如果你想在不是mac OS的系统下使用swift,那就能用到SPM了。
建立一个以下的目录
example[这是个文件夹,起什么名字都行]
├── Sources[这是个文件夹,默认这个名字,里面放你需要生成库的.swift文件]
│ ├── Person.swift
│ ├── Cat.swift
│ └── Dog.swift
└── Package.swift[必须这个名字]
然后在Package.swift中写上依赖的内容
import PackageDescription
let package = Package(
name: "exmaple" // 这里填你这个Package的名字
)
然后去github生成一个远程仓库,在example目录下
$ git init
$ git add *
$ git commit -m "SPM example"
$ git remote add origin git@github.com:xxx/example.git
$ git push -u origin master
$ git tag 1.0.0
$ git push --tags
这时候就可以新建一个目录测试是否成功了
$ mkdir test
$ cd test
$ vim Package.swift
在Package.swift中输入
import PackageDescription
let package = Package(
name: "test",
targets: [],
dependencies: [
.Package(url: "https://github.com/xxx/example.git",
majorVersion: 1)
]
)
在 test 目录下:
$ swift build
这时候应该看到提示成功了,到这里已经完成了
附带一些自己踩过的坑
- 如果example的目录下有很多别的文件夹,在
$ swift build
的时候有可能会出现这个错误package has unsupported layout; multiple source roots found:
example
├── Sources
│ ├── Person.swift
│ ├── Cat.swift
│ └── Dog.swift
└── Package.swift
│── a[不需要参与编译的文件]
│── b[不需要参与编译的文件]
└── Package.swift
出现这个错误的时候example/Package.swift 需要这样写:
import PackageDescription
let package = Package(
name: "exmaple", // 这里填你这个Package的名字
exclude:["a","b"]
)
如果你这个库还依赖了别的库,还可以这样写:
import PackageDescription
let package = Package(
name: "exmaple", // 这里填你这个Package的名字
dependencies: [
.Package(url: "https://github.com/depend/depend.git", majorVersion: 0)
],
exclude:["a","b"]
)
- majorVersion只能是Int,我如果发布的不是整数tag怎么办?
可以换成选择版本范围,默认是根据当前范围最高的版本更新的
import PackageDescription let package = Package( name: "test", dependencies: [ .Package(url: "https://github.com/xxx/example.git",versions: Version(0, 0, 0)..<Version(1, .max, .max))] ] )
- swift build了很久最后出现 error: reachedTimeLimit
这种情况我之前遇到过,具体是为什么导致当时没留意,但是你可以从这几个方面排查:
- Package指定的版本是否有错
- 更新了新的版本,不能直接
$ swift build
需要:$ rm -rf .build/ $ rm Package.resolved
- dependencies是否有错
- 如果有引入c文件还需要特殊处理,因为我还没试过,只是在看文档的时候发现有,如果工程中有使用可以去Swift.org和GitHub了解更多
请保持转载后文章内容的完整,以及文章出处。本人保留所有版权相关权利。