Swift Package Manger的制作和使用

一、SPM库组成
1.1 Package.swift 组件分析
Package.swift 是整个包描述,它依赖 PackageDescription 结构,该结构定义了一个 SPM 导出包需要指定哪些配置信息:

// struct Package
init(
    name: String, 
    defaultLocalization: LanguageTag? = nil, 
    platforms: [SupportedPlatform]? = nil, 
    pkgConfig: String? = nil, 
    providers: [SystemPackageProvider]? = nil, 
    products: [Product] = [], 
    dependencies: [Package.Dependency] = [], 
    targets: [Target] = [], 
    swiftLanguageVersions: [SwiftVersion]? = nil, 
    cLanguageStandard: CLanguageStandard? = nil, 
    cxxLanguageStandard: CXXLanguageStandard? = nil
)
  • name:Swift包的名称;
  • defaultLocalization:资源的默认本地化;
  • platforms:支持的最低系统平台的列表;
  • pkgConfig:用于C模块的名称。如果存在,Xcode将搜索.pc文件以获取系统目标所需的其他标志;
  • providers:系统目标的程序包提供者;
  • products:此软件包可让客户使用的产品列表;
  • dependencies:软件包依赖项列表(可空,或需要其它外部依赖);
  • targets:属于此软件包的目标列表(源码目录、测试目录);
  • swiftLanguageVersions:此软件包兼容的Swift版本列表;
  • cLanguageStandard:用于此程序包中所有C目标的C语言标准;
  • cxxLanguageStandard:用于此程序包中所有C ++目标的C ++语言标准;

一般来说,上面的这些配置,通常,我们需要的是:name、platforms、products、dependencies、targets。

二、创建自己的SPM库

2.1可以使用Xcode创建或用命令行创建,这里只使用Xcode创建示例:

Xcode -> File -> New -> Package...
image.png
输入项目名,点击create
image.png
Xcode 自动帮我们生成了配置文件和源码目录:
image.png

2.2 编写风们的SPM库

  • Logger.swift 代码如下:
public struct Logger {
    var DEBUG: Bool = false
    
    /*
     这里是 struct,所以按照 swift 的 struct 语法,可以不写 init,
     但是,因为是封装成 SPM 库,需要对外暴露,
     所以 init 构造器不能默认不写,一定需要有 public 构造器,否则外部无法初始化
     */
    public init() {
    }
    
    public init(_ debug: Bool) {
        self.DEBUG = debug
    }
    
    public func log(_ msg: String) {
        if DEBUG {
            debugPrint("Logger: \(msg)")
        }
    }
}
  • 修改测试用例LoggerTests.swift,不然会报错:
import XCTest
@testable import Logger

final class LoggerTests: XCTestCase {
    func testExample() throws {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct
        // results.
        Logger(true).log("hhm")
    }
    
    static var allTests = [
        ("testExample", testExample),
    ]
}

然后command+B编译就能成功了

2.3 本地集成SPM库

1.关闭SPM Xcode工程
2.打开需要集成SPM的项目工程

  • 添加本地SPM库


    image.png
  • 点击+
    image.png
  • 点击Add Local...,选择我们自己的本地SPM项目,添加到项目中
    image.png

    3.添加framework链接,如图:
    image.png
  • 点击+号,选择如下:
    image.png
  • 点击Add即可
    image.png
  • 代码测试
import Logger

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        Logger(true).log("test log")
    }
}

输出结果:


image.png

2.4 上传至Github

  1. 我是使用Github desktop工具上传的,自行百度,这里不复述了。
  2. 重新集成
  • 移除之前添加本地的SPM文件(2.3第2步)
  • 移除手动添加的framework(2.3第3步)
  • 集成SPM包,完成


    image.png

SPMDemo

参考文章:
iOS包依赖管理工具(五):Swift Package Manager(SPM)自定义篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容