cocoapods-publishing-workflow
$
npx mdskill add TheBushidoCollective/han/cocoapods-publishing-workflowExecute secure CocoaPods library publishing to Trunk.
- Handles podspec validation and trunk registration.
- Integrates with CocoaPods CLI and Git version control.
- Decides actions based on podspec lint results.
- Delivers success status via terminal output.
SKILL.md
.github/skills/cocoapods-publishing-workflowView on GitHub ↗
---
name: cocoapods-publishing-workflow
user-invocable: false
description: Use when publishing CocoaPods libraries to CocoaPods Trunk. Covers pod trunk registration, podspec validation, version management, and publishing best practices for successful library distribution.
allowed-tools:
- Read
- Write
- Edit
- Bash
- Grep
- Glob
---
# CocoaPods - Publishing Workflow
Complete guide to publishing your CocoaPods library to the official CocoaPods Trunk.
## Publishing Overview
### Process Steps
1. **Register with CocoaPods Trunk** (one-time)
2. **Prepare your podspec**
3. **Validate locally** (`pod lib lint`)
4. **Validate for publishing** (`pod spec lint`)
5. **Tag version in git**
6. **Push to Trunk** (`pod trunk push`)
## Trunk Registration
### Register Email (One-Time)
```bash
# Register your email
pod trunk register email@example.com 'Your Name'
# Verify email (check inbox for verification link)
# Click link in email to activate account
```
### Check Registration
```bash
# Verify registration
pod trunk me
# Sample output:
# - Name: Your Name
# - Email: email@example.com
# - Since: January 1st, 2024
# - Pods: None
```
## Podspec Preparation
### Version Management
```ruby
Pod::Spec.new do |spec|
# Semantic versioning: MAJOR.MINOR.PATCH
spec.version = '1.0.0'
# Must match git tag
spec.source = {
:git => 'https://github.com/username/MyLibrary.git',
:tag => spec.version.to_s
}
end
```
### Required Metadata
```ruby
Pod::Spec.new do |spec|
# Identity (required)
spec.name = 'MyLibrary'
spec.version = '1.0.0'
# Description (required)
spec.summary = 'Brief one-line description'
spec.description = 'Longer description with more details about what the library does'
# Links (required)
spec.homepage = 'https://github.com/username/MyLibrary'
spec.source = { :git => 'https://github.com/username/MyLibrary.git', :tag => spec.version.to_s }
# License (required)
spec.license = { :type => 'MIT', :file => 'LICENSE' }
# Authors (required)
spec.authors = { 'Your Name' => 'email@example.com' }
# Platform (required)
spec.ios.deployment_target = '13.0'
end
```
## Local Validation
### Quick Validation
```bash
# Fast validation (skips build)
pod lib lint --quick
# Check for common issues without full build
```
### Full Validation
```bash
# Complete validation with build
pod lib lint
# With Swift version
pod lib lint --swift-version=5.9
# Verbose output
pod lib lint --verbose
```
### Handle Warnings
```bash
# Allow warnings (not recommended for new pods)
pod lib lint --allow-warnings
# Better: Fix warnings
pod lib lint
# Address each warning individually
```
## Publishing Validation
### Spec Lint
```bash
# Validate podspec for publishing
pod spec lint
# Validates against remote repository
# Simulates real-world installation
```
### Pre-Publishing Checklist
- [ ] All tests pass
- [ ] No lint warnings
- [ ] Privacy manifest included (iOS 17+)
- [ ] README is complete
- [ ] LICENSE file exists
- [ ] CHANGELOG updated
- [ ] Version number is correct
- [ ] Git repository is clean
## Git Tagging
### Create Tag
```bash
# Stage all changes
git add .
# Commit changes
git commit -m "Release version 1.0.0"
# Create tag matching podspec version
git tag 1.0.0
# Push to remote with tags
git push origin main --tags
```
### Tag Format
```bash
# Semantic versioning
git tag 1.0.0 # MAJOR.MINOR.PATCH
git tag 1.0.0-beta.1 # Pre-release
git tag 1.0.0-rc.1 # Release candidate
# Must match spec.version in podspec
```
## Publishing to Trunk
### Push Pod
```bash
# Push to CocoaPods Trunk
pod trunk push MyLibrary.podspec
# With specific Swift version
pod trunk push MyLibrary.podspec --swift-version=5.9
# Allow warnings (not recommended)
pod trunk push MyLibrary.podspec --allow-warnings
```
### Successful Publish Output
```
Validating podspec
-> MyLibrary (1.0.0)
Updating spec repo `trunk`
-> MyLibrary (1.0.0)
--------------------------------------------------------------------------------
🎉 Congrats
🚀 MyLibrary (1.0.0) successfully published
📅 January 1st, 2024
🌎 https://cocoapods.org/pods/MyLibrary
👍 Tell your friends!
--------------------------------------------------------------------------------
```
## Version Updates
### Patch Release (Bug Fixes)
```ruby
# In podspec
spec.version = '1.0.1' # Was 1.0.0
```
```bash
# Git workflow
git add .
git commit -m "Fix: Resolve crash in background mode"
git tag 1.0.1
git push origin main --tags
pod trunk push MyLibrary.podspec
```
### Minor Release (New Features)
```ruby
# In podspec
spec.version = '1.1.0' # Was 1.0.1
```
```bash
# Git workflow
git add .
git commit -m "Add: Support for custom themes"
git tag 1.1.0
git push origin main --tags
pod trunk push MyLibrary.podspec
```
### Major Release (Breaking Changes)
```ruby
# In podspec
spec.version = '2.0.0' # Was 1.1.0
```
```bash
# Git workflow
git add .
git commit -m "BREAKING: Refactor API for modern Swift"
git tag 2.0.0
git push origin main --tags
pod trunk push MyLibrary.podspec
```
## Managing Multiple Pods
### List Your Pods
```bash
# View all your published pods
pod trunk me
# Shows:
# - Pods:
# - MyLibrary
# - MyOtherLibrary
```
### Add Contributors
```bash
# Add team member to pod
pod trunk add-owner MyLibrary email@example.com
# Remove contributor
pod trunk remove-owner MyLibrary email@example.com
```
## Deprecation
### Deprecate Old Version
```bash
# Deprecate specific version
pod trunk deprecate MyLibrary --version=1.0.0
# Deprecate entire pod
pod trunk deprecate MyLibrary
```
### Deprecation with Replacement
```ruby
# In podspec
spec.deprecated = true
spec.deprecated_in_favor_of = 'NewAwesomeLibrary'
```
## Common Issues
### Issue: Tag Doesn't Match
```
ERROR | [MyLibrary] The repo has no tag for version 1.0.0
```
**Solution:**
```bash
# Create and push tag
git tag 1.0.0
git push origin --tags
```
### Issue: Validation Fails
```
ERROR | [MyLibrary] xcodebuild: Returned an unsuccessful exit code
```
**Solution:**
```bash
# Run detailed validation
pod lib lint --verbose
# Fix errors shown in output
# Re-validate until clean
```
### Issue: Missing License
```
ERROR | [MyLibrary] Missing required attribute `license`
```
**Solution:**
```ruby
# Add to podspec
spec.license = { :type => 'MIT', :file => 'LICENSE' }
```
```bash
# Create LICENSE file in repo root
```
## Best Practices
### Pre-Publish Testing
```bash
# 1. Test in example app
cd Example
pod install
# Run app, verify functionality
# 2. Test in real project
# Create test project, add pod from local path
pod 'MyLibrary', :path => '../MyLibrary'
# 3. Validate
pod lib lint
pod spec lint
```
### Version Numbering
```ruby
# Follow semantic versioning strictly
spec.version = '1.0.0' # Initial release
spec.version = '1.0.1' # Bug fix
spec.version = '1.1.0' # New feature
spec.version = '2.0.0' # Breaking change
```
### CHANGELOG
```markdown
# Changelog
## [1.1.0] - 2024-01-15
### Added
- Custom theme support
- Dark mode compatibility
### Fixed
- Memory leak in background processing
## [1.0.0] - 2024-01-01
- Initial release
```
### README
```markdown
# MyLibrary
Brief description of library.
## Installation
\`\`\`ruby
pod 'MyLibrary', '~> 1.0'
\`\`\`
## Usage
\`\`\`swift
import MyLibrary
let library = MyLibrary()
library.doSomething()
\`\`\`
## Requirements
- iOS 13.0+
- Swift 5.7+
## License
MyLibrary is available under the MIT license.
```
## Anti-Patterns
### Don't
❌ Publish without testing
```bash
pod trunk push --skip-tests # Risky
```
❌ Use `--allow-warnings` for initial release
```bash
pod trunk push --allow-warnings # Fix warnings instead
```
❌ Forget to tag git
```bash
# Missing git tag - publish will fail
pod trunk push
```
❌ Skip version bump
```ruby
# Still version 1.0.0 after changes - confusing
spec.version = '1.0.0'
```
### Do
✅ Test thoroughly before publishing
```bash
pod lib lint
pod spec lint
# Test in real project
```
✅ Fix all warnings
```bash
pod lib lint
# Address warnings
```
✅ Always tag git
```bash
git tag 1.0.0
git push --tags
```
✅ Bump version for every release
```ruby
spec.version = '1.0.1' # Incremented
```
## Complete Publishing Example
```bash
# 1. Prepare podspec
vim MyLibrary.podspec
# Update version to 1.0.0
# 2. Update CHANGELOG
vim CHANGELOG.md
# Document changes
# 3. Commit and tag
git add .
git commit -m "Release 1.0.0: Initial public release"
git tag 1.0.0
git push origin main --tags
# 4. Validate locally
pod lib lint
# 5. Validate for publishing
pod spec lint
# 6. Publish
pod trunk push MyLibrary.podspec
# 7. Verify
pod search MyLibrary
# Should show your new pod
```
## Related Skills
- cocoapods-podspec-fundamentals
- cocoapods-subspecs-organization
- cocoapods-test-specs
- cocoapods-privacy-manifests