名称: 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