如何用 CocoaPods 分发 swift 宏

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

前几天的文章讲了如何在不使用 Swift 包管理器的情况下将 Swift 宏编译为二进制文件并将其导入到 Xcode 项目中。

感兴趣的可以去看一下,今天来讲讲如何使用 CocoaPods 分发你的 Swift 宏。

如何不通过 SPM 使用 Swift 宏

创建 Pod 库

在使用 CocoaPods 分发宏之前,你需要先创建一个 Pod 库,该库封装宏二进制文件并将宏 API 公开给其客户端,这种方式类似于 Swift Package Manager 的执行方式。

执行命令创建 Pod 库:

pod lib create StringifyMacro

此命令会创建一个名为 StringifyMacro 的 Pod 库,对应的,会有一个 PodSpec 文件,大概是这样:

Pod::Spec.new do |s|
  s.name             = 'StringifyMacro'
  s.version          = '0.1.0'
  s.summary          = 'A short description of StringifyMacro.'

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://github.com/StringifyMacro'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'ios 新知' => 'iosnews@163.com' }
  s.source           = { :git => 'https://github.com/StringifyMacro.git', :tag => s.version.to_s }
  s.swift_version = "5.9"
  s.ios.deployment_target = '10.0'
  s.source_files = 'StringifyMacro/Classes/**/*'
  s.preserve_paths = ["StringifyMacro/macros/StringifyMacros"]
  s.pod_target_xcconfig = {
      'OTHER_SWIFT_FLAGS' => '-load-plugin-executable ${PODS_ROOT}/StringifyMacro/StringifyMacro/macros/StringifyMacros#StringifyMacros'
    }
  s.user_target_xcconfig = {
      'OTHER_SWIFT_FLAGS' => '-load-plugin-executable ${PODS_ROOT}/StringifyMacro/StringifyMacro/macros/StringifyMacros#StringifyMacros'
    }
end

然后你需要修改这个文件来告诉 Pod 应该从哪里读取对应的宏文件,简单介绍下这个文件:

  • s.source_files,用来指向源文件,我们设置为 StringifyMacro/Classes 下所有文件。

  • s.preserve_paths,宏二进制文件不是源文件,因此当 CocoaPods 将源文件复制到客户端项目时,你需要告诉 CocoaPods 保留它,以便后面链接,这个属性的作用是指定一些文件或目录路径,这些路径中的内容将会被保留在 Pods 目录中(即使它们不会被直接编译或包含在最终的项目中)。

  • s.pod_target_xcconfig,使用 -load-plugin-executable 标志添加到 Pod target 的 OTHER_SWIFT_FLAGS 中,用来夹在宏二进制文件,没记错的话,这个选项是 swift 5.9 新增的。

  • s.user_target_xcconfigpod_target_xcconfig 不足以使宏可用于项目。虽然 pod 目标本身会编译,但如果你不做这个配置,将报一个错误,找不到宏实现。

导入和使用宏

我们还是以上篇文章中创建的宏为例,将宏的二进制文件放到你的 Pod 目录下,我这里就是 StringifyMacro/StringifyMacro/macro/StringifyMacros

然后重新 pod install 一下,宏的二进制文件就会添加到你的 pod 工程中来了。

此时还不能直接使用这个宏,还需要在 pod 里新建一个 swift 文件,名字随便,里边写上:

import Foundation

@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(module: "StringifyMacros", type: "StringifyMacro")

之后就可以在你的项目中使用宏了,首先导入我们的 pod 头文件:

然后在需要的地方使用:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        print(#stringify(2 + 3))
    }

}

最后检查打印结果:

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

注册登录 后评论
    // 作者
    iOS新知 发布于 掘金
    • 0
    // 本帖子
    分类
    // 相关帖子
    Coming soon...
    • 0
    如何用 CocoaPods 分发 swift 宏iOS新知 发布于 掘金