| name | cocoapods-podspec-fundamentals |
| description | Use when creating or modifying CocoaPods podspec files. Covers required attributes, file patterns, dependencies, and platform specifications for iOS, macOS, tvOS, watchOS, and visionOS projects. |
| allowed-tools | ["Read","Write","Edit","Bash","Grep","Glob"] |
CocoaPods - Podspec Fundamentals
Essential patterns for creating and maintaining podspec files that define CocoaPods libraries.
Required Attributes
Every podspec must include these attributes:
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 = { 'Your Name' => 'email@example.com' }
spec.summary = 'Brief description under 140 characters'
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
Platform Specifications
Current Platform Support (2024)
spec.ios.deployment_target = '13.0'
spec.osx.deployment_target = '10.15'
spec.tvos.deployment_target = '13.0'
spec.watchos.deployment_target = '6.0'
spec.visionos.deployment_target = '1.0'
Multi-Platform Support
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 File Patterns
Basic Source Files
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/*'
Platform-Specific Source Files
spec.ios.source_files = 'Source/iOS/**/*.swift'
spec.osx.source_files = 'Source/macOS/**/*.swift'
spec.source_files = 'Source/Shared/**/*.swift'
Resource Management
Resource Bundles (Recommended)
spec.resource_bundles = {
'MyLibrary' => [
'Resources/**/*.{png,jpg,xcassets,storyboard,xib}',
'Resources/**/*.xcprivacy'
]
}
Direct Resources (Legacy)
spec.resources = 'Assets/**/*'
spec.ios.resources = 'Assets/iOS/**/*'
spec.osx.resources = 'Assets/macOS/**/*'
Dependencies
CocoaPods Dependencies
spec.dependency 'Alamofire'
spec.dependency 'SwiftyJSON', '5.0.0'
spec.dependency 'RxSwift', '~> 6.0'
spec.dependency 'SnapKit', '>= 5.0'
spec.ios.dependency 'UIKit'
spec.osx.dependency 'AppKit'
System Frameworks and Libraries
spec.frameworks = 'UIKit', 'Foundation', 'CoreGraphics'
spec.ios.frameworks = 'UIKit', 'CoreLocation'
spec.osx.frameworks = 'AppKit', 'CoreData'
spec.libraries = 'z', 'sqlite3'
spec.weak_frameworks = 'UserNotifications'
Vendored Frameworks
XCFramework Support (Modern)
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'
Static Libraries
spec.vendored_libraries = 'Libraries/*.a'
spec.vendored_libraries = 'Libraries/libMyLib.a'
spec.public_header_files = 'Headers/**/*.h'
Compiler and Linker Flags
spec.compiler_flags = '-Wno-deprecated-declarations'
spec.xcconfig = {
'OTHER_LDFLAGS' => '-ObjC',
'ENABLE_BITCODE' => 'NO'
}
spec.requires_arc = true
spec.requires_arc = 'Source/**/*.m'
spec.requires_arc = false
Swift Support
Swift Version
spec.swift_versions = ['5.5', '5.6', '5.7', '5.8', '5.9']
spec.swift_version = '5.9'
Module Map
spec.module_map = 'Source/module.modulemap'
spec.module_name = 'MyCustomModule'
Version Management
Semantic Versioning
spec.version = '1.2.3'
spec.version = '2.0.0-beta.1'
spec.version = '1.0.0-rc.1'
spec.source = { :git => 'https://github.com/username/MyLibrary.git', :tag => spec.version.to_s }
Best Practices
File Organization
MyLibrary/
├── MyLibrary.podspec
├── LICENSE
├── README.md
├── Source/
│ ├── Core/
│ ├── Extensions/
│ └── Utilities/
├── Resources/
│ ├── Assets.xcassets
│ └── PrivacyInfo.xcprivacy
└── Tests/
└── MyLibraryTests/
Common Patterns
Pod::Spec.new do |spec|
spec.name = 'MyLibrary'
spec.version = '1.0.0'
spec.summary = 'A brief description'
spec.description = 'A longer description that provides more detail'
spec.homepage = 'https://github.com/username/MyLibrary'
spec.license = { :type => 'MIT', :file => 'LICENSE' }
spec.authors = { 'Your Name' => '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'
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
Anti-Patterns
Don't
❌ Use direct resources (causes name collisions)
spec.resources = 'Assets/**/*'
❌ Omit platform deployment targets
❌ Include test files in main source
spec.source_files = '**/*.swift'
❌ Use absolute paths
spec.source_files = '/Users/username/MyLibrary/Source/**/*'
Do
✅ Use resource bundles
spec.resource_bundles = { 'MyLibrary' => ['Resources/**/*'] }
✅ Specify platform targets explicitly
spec.ios.deployment_target = '13.0'
✅ Exclude test files
spec.source_files = 'Source/**/*.swift'
spec.exclude_files = 'Tests/**/*'
✅ Use relative paths from repo root
spec.source_files = 'Source/**/*.swift'
Validation
Local Validation
pod lib lint --quick
pod lib lint
pod lib lint --allow-warnings
pod lib lint --skip-tests
Publishing Validation
pod spec lint
pod spec lint --swift-version=5.9
Related Skills
- cocoapods-subspecs-organization
- cocoapods-test-specs
- cocoapods-privacy-manifests
- cocoapods-publishing-workflow