CocoaPodsPodspec基础Skill cocoapods-podspec-fundamentals

这个技能用于创建和修改CocoaPods的podspec文件,定义iOS、macOS、tvOS、watchOS和visionOS项目的库依赖,涵盖必需属性、文件模式、依赖关系和平台规范。关键词:CocoaPods, podspec, iOS开发, 移动开发, 依赖管理, 库管理

移动开发 0 次安装 0 次浏览 更新于 3/25/2026

名称: cocoapods-podspec-fundamentals 用户可调用: false 描述: 在创建或修改CocoaPods podspec文件时使用。涵盖iOS、macOS、tvOS、watchOS和visionOS项目所需的属性、文件模式、依赖关系和平台规范。 允许工具:

  • 读取
  • 写入
  • 编辑
  • Bash
  • Grep
  • Glob

CocoaPods - Podspec 基础

创建和维护定义CocoaPods库的podspec文件的基本模式。

必需属性

每个podspec必须包含这些属性:

Pod::Spec.new do |spec|
  # 身份
  spec.name         = 'MyLibrary'
  spec.version      = '1.0.0'

  # 元数据
  spec.license      = { :type => 'MIT', :file => 'LICENSE' }
  spec.homepage     = 'https://github.com/username/MyLibrary'
  spec.authors      = { '您的姓名' => 'email@example.com' }
  spec.summary      = '简短描述,不超过140个字符'

  # 源
  spec.source       = { :git => 'https://github.com/username/MyLibrary.git', :tag => spec.version.to_s }

  # 平台支持
  spec.ios.deployment_target = '13.0'
  spec.osx.deployment_target = '10.15'
end

平台规范

当前平台支持(2024)

# iOS(iPhone、iPad)
spec.ios.deployment_target = '13.0'

# macOS(Mac计算机)
spec.osx.deployment_target = '10.15'

# tvOS(Apple TV)
spec.tvos.deployment_target = '13.0'

# watchOS(Apple Watch)
spec.watchos.deployment_target = '6.0'

# visionOS(Apple Vision Pro)- 在CocoaPods 1.15.0+中添加
spec.visionos.deployment_target = '1.0'

多平台支持

# 简单方法 - 所有平台相同版本
spec.platform = :ios, '13.0'

# 推荐 - 按平台指定
spec.ios.deployment_target = '13.0'
spec.osx.deployment_target = '10.15'
spec.tvos.deployment_target = '13.0'
spec.watchos.deployment_target = '6.0'

源文件模式

基本源文件

# Source目录中的所有Swift和Objective-C文件
spec.source_files = 'Source/**/*.{swift,h,m}'

# 仅公共头文件
spec.public_header_files = 'Source/**/*.h'

# 私有/内部头文件
spec.private_header_files = 'Source/**/*Private.h'

# 排除特定文件或目录
spec.exclude_files = 'Source/**/Internal/*', 'Source/**/Tests/*'

平台特定源文件

# 仅iOS文件
spec.ios.source_files = 'Source/iOS/**/*.swift'

# 仅macOS文件
spec.osx.source_files = 'Source/macOS/**/*.swift'

# 所有平台共享文件
spec.source_files = 'Source/Shared/**/*.swift'

资源管理

资源包(推荐)

# 推荐 - 避免名称冲突
spec.resource_bundles = {
  'MyLibrary' => [
    'Resources/**/*.{png,jpg,xcassets,storyboard,xib}',
    'Resources/**/*.xcprivacy'  # 隐私清单(iOS 17+)
  ]
}

直接资源(传统)

# 传统方法 - 可能导致名称冲突
spec.resources = 'Assets/**/*'

# 平台特定资源
spec.ios.resources = 'Assets/iOS/**/*'
spec.osx.resources = 'Assets/macOS/**/*'

依赖关系

CocoaPods依赖

# 任何版本
spec.dependency 'Alamofire'

# 特定版本
spec.dependency 'SwiftyJSON', '5.0.0'

# 版本范围(乐观运算符 - 推荐)
spec.dependency 'RxSwift', '~> 6.0'  # >= 6.0, < 7.0

# 最低版本
spec.dependency 'SnapKit', '>= 5.0'

# 平台特定依赖
spec.ios.dependency 'UIKit'
spec.osx.dependency 'AppKit'

系统框架和库

# 系统框架
spec.frameworks = 'UIKit', 'Foundation', 'CoreGraphics'

# 平台特定框架
spec.ios.frameworks = 'UIKit', 'CoreLocation'
spec.osx.frameworks = 'AppKit', 'CoreData'

# 系统库
spec.libraries = 'z', 'sqlite3'

# 弱框架(运行时可选)
spec.weak_frameworks = 'UserNotifications'

供应商框架

XCFramework支持(现代)

# 单个XCFramework
spec.vendored_frameworks = 'MyFramework.xcframework'

# 多个框架
spec.vendored_frameworks = 'Frameworks/*.xcframework', 'Frameworks/*.framework'

# 平台特定
spec.ios.vendored_frameworks = 'Frameworks/iOS/*.xcframework'
spec.osx.vendored_frameworks = 'Frameworks/macOS/*.framework'

静态库

# 供应商静态库
spec.vendored_libraries = 'Libraries/*.a'

# 带公共头文件
spec.vendored_libraries = 'Libraries/libMyLib.a'
spec.public_header_files = 'Headers/**/*.h'

编译器和链接器标志

# 编译器标志
spec.compiler_flags = '-Wno-deprecated-declarations'

# 链接器标志
spec.xcconfig = {
  'OTHER_LDFLAGS' => '-ObjC',
  'ENABLE_BITCODE' => 'NO'
}

# ARC支持(按文件模式)
spec.requires_arc = true
spec.requires_arc = 'Source/**/*.m'  # 仅特定文件

# 不使用ARC的文件
spec.requires_arc = false

Swift支持

Swift版本

# Swift版本(Swift库必需)
spec.swift_versions = ['5.5', '5.6', '5.7', '5.8', '5.9']

# 或指定单个版本
spec.swift_version = '5.9'

模块映射

# 自定义模块映射
spec.module_map = 'Source/module.modulemap'

# 模块名称(如果与pod名称不同)
spec.module_name = 'MyCustomModule'

版本管理

语义化版本

# MAJOR.MINOR.PATCH
spec.version = '1.2.3'

# 预发布版本
spec.version = '2.0.0-beta.1'
spec.version = '1.0.0-rc.1'

# 使用git源中的标签
spec.source = { :git => 'https://github.com/username/MyLibrary.git', :tag => spec.version.to_s }

最佳实践

文件组织

MyLibrary/
├── MyLibrary.podspec
├── LICENSE
├── README.md
├── Source/
│   ├── Core/
│   ├── Extensions/
│   └── Utilities/
├── Resources/
│   ├── Assets.xcassets
│   └── PrivacyInfo.xcprivacy
└── Tests/
    └── MyLibraryTests/

常见模式

Pod::Spec.new do |spec|
  spec.name         = 'MyLibrary'
  spec.version      = '1.0.0'
  spec.summary      = '简短描述'
  spec.description  = '更长的描述,提供更多细节'

  spec.homepage     = 'https://github.com/username/MyLibrary'
  spec.license      = { :type => 'MIT', :file => 'LICENSE' }
  spec.authors      = { '您的姓名' => 'email@example.com' }
  spec.source       = { :git => 'https://github.com/username/MyLibrary.git', :tag => spec.version.to_s }

  # 平台支持
  spec.ios.deployment_target = '13.0'
  spec.osx.deployment_target = '10.15'

  # Swift版本
  spec.swift_versions = ['5.7', '5.8', '5.9']

  # 源文件
  spec.source_files = 'Source/**/*.{swift,h,m}'

  # 资源
  spec.resource_bundles = {
    'MyLibrary' => ['Resources/**/*']
  }

  # 依赖
  spec.dependency 'Alamofire', '~> 5.0'

  # 框架
  spec.frameworks = 'Foundation'
  spec.ios.frameworks = 'UIKit'
  spec.osx.frameworks = 'AppKit'
end

反模式

不要

❌ 使用直接资源(导致名称冲突)

spec.resources = 'Assets/**/*'  # 不好

❌ 省略平台部署目标

# 缺少部署目标 - 将使用CocoaPods默认值

❌ 在主源中包含测试文件

spec.source_files = '**/*.swift'  # 包含测试文件!

❌ 使用绝对路径

spec.source_files = '/Users/username/MyLibrary/Source/**/*'  # 不好

✅ 使用资源包

spec.resource_bundles = { 'MyLibrary' => ['Resources/**/*'] }

✅ 明确指定平台目标

spec.ios.deployment_target = '13.0'

✅ 排除测试文件

spec.source_files = 'Source/**/*.swift'
spec.exclude_files = 'Tests/**/*'

✅ 使用从仓库根目录的相对路径

spec.source_files = 'Source/**/*.swift'

验证

本地验证

# 快速验证(跳过构建)
pod lib lint --quick

# 完整验证,包括构建
pod lib lint

# 允许警告
pod lib lint --allow-warnings

# 跳过测试
pod lib lint --skip-tests

发布验证

# 发布前验证
pod spec lint

# 指定Swift版本
pod spec lint --swift-version=5.9

相关技能

  • cocoapods-subspecs-organization
  • cocoapods-test-specs
  • cocoapods-privacy-manifests
  • cocoapods-publishing-workflow