Fixing "Header Files Outside of header_mappings_dir" in CocoaPods
Problem: You're trying to build a CocoaPod and you're encountering the dreaded "header files outside of header_mappings_dir" error from pod lib lint
. This error usually happens when you have header files in your pod that are not listed in the header_mappings_dir
section of your Podspec file.
Scenario: Let's say you have a pod named "MyAwesomeLibrary" with the following structure:
MyAwesomeLibrary/
├── MyAwesomeLibrary.h
├── Source/
│ ├── MyAwesomeClass.h
│ └── MyAwesomeClass.m
└── Example/
└── Example/
└── ViewController.m
Your MyAwesomeLibrary.podspec
looks like this:
Pod::Spec.new do |s|
s.name = 'MyAwesomeLibrary'
s.version = '1.0.0'
s.summary = 'An amazing library!'
s.homepage = 'https://github.com/YourUsername/MyAwesomeLibrary'
s.license = { :type => 'MIT' }
s.author = { 'Your Name' => '[email protected]' }
s.source = { :git => 'https://github.com/YourUsername/MyAwesomeLibrary.git', :tag => s.version }
s.source_files = 'Source/**/*.{h,m}'
s.public_header_files = 'MyAwesomeLibrary.h'
s.frameworks = 'UIKit'
s.dependency 'AFNetworking', '~> 3.0'
end
When you run pod lib lint
, you might see an error similar to:
[!] The following header files are not listed in the `header_mappings_dir` section of your Podspec:
MyAwesomeLibrary/MyAwesomeLibrary.h
Why the error?
The header_mappings_dir
setting in your Podspec is crucial for CocoaPods to correctly identify and include your headers when integrating your library into a project. Essentially, it maps your pod's internal directory structure to how it will be presented to the consuming project.
The error occurs because you're trying to include a header file (MyAwesomeLibrary.h
) that isn't directly under the directory specified by header_mappings_dir
. By default, CocoaPods assumes your header_mappings_dir
is the root of your pod, so any files not within Source
, Classes
, or other explicitly defined directories will throw this error.
Fixing the Problem:
-
Update your Podspec:
There are a few ways to address this error. The easiest is to move the
MyAwesomeLibrary.h
file into theSource
directory along with the other source files.Pod::Spec.new do |s| # ... existing code ... s.source_files = 'Source/**/*.{h,m}' s.public_header_files = 'Source/MyAwesomeLibrary.h' # Moved to the Source directory s.frameworks = 'UIKit' # ... existing code ... end
-
Explicitly set
header_mappings_dir
:If you want to keep
MyAwesomeLibrary.h
at the root of your pod, you can explicitly set theheader_mappings_dir
to an empty string:Pod::Spec.new do |s| # ... existing code ... s.source_files = 'Source/**/*.{h,m}', 'MyAwesomeLibrary.h' s.public_header_files = 'MyAwesomeLibrary.h' s.header_mappings_dir = '.' # This tells CocoaPods to include files from the pod's root directory s.frameworks = 'UIKit' # ... existing code ... end
-
Use subspecs:
For more complex libraries, you can leverage subspecs to organize your code. Subspecs can have their own
header_mappings_dir
settings, allowing you to define different header structures within your pod.
Additional Notes:
- Make sure your
source_files
setting in your Podspec accurately reflects the location of all your source files. - If you're still encountering issues, double-check your Podspec for any typos or inconsistencies in the file paths.
- You can always consult the CocoaPods documentation for more detailed information on Podspec settings and best practices: https://guides.cocoapods.org/syntax/podspec.html
By carefully configuring your Podspec, you can ensure that your library integrates seamlessly into other projects and avoids potential headaches with header file management.