現在 iOS アプリ開発において、ライブラリの導入には Swift Package Manager が標準となりつつあります。
CocoaPods の利用シーンは減りつつありますが、下位の iOS バージョンサポートや、様々な理由でライブラリのバージョンを上げることができない場面では、まだ利用が必須のシーンもあります。
iOS エンジニアの採用コードチェックにおいても利用されるケースがあって、その場合に警告を無視した状態で提出されることもあります。それに対するフィードバックを書いていましたが、以下の補足として、最初からこういうところに気をつけてほしい内容を記事としてまとめます。
私が(iOS エンジニアの)採用でコードチェックする時何を見ているのか
チェック項目
- Swift Package Manager で導入できないか
- platform が指定されているか
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES が指定されているか
- master の参照が残っていないか
- Pods ディレクトリをリポジトリに含めていないか
Swift Package Manager で導入できないか
まず、前述の通り、 Swift Package Manager で導入できるなら、 Swift Package Manager を利用しましょう。
導入したいライブラリが CocoaPods にしか対応していないなど特別な理由があって、 CocoaPods での導入を決めたなどのパッケージマネージャの選定理由があると嬉しいです。
よくある警告
次に CocoaPods での導入となった場合、導入時の警告は可能な限り対応されていることが望ましいです。
対応しない場合は、こういった理由で対応していない、というコメントがコミットメッセージや PR に記録されていると安心です。
platform が指定されているか
platform が未指定だと、以下の警告が出力されます。
[!] Automatically assigning platform `iOS` with version `15.0` on target `iOSEngineerCodeCheck` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
Podfile にもコメント付きで指定方法が明記されています。
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
こうすれば良いです。
platform :ios, '9.0'
未指定なら iOS 15.0 が指定されますが、それを意図する場合でも、デフォルトの挙動が変わることもあるので、想定している OS バージョンを指定しておくと安心です。
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES が指定されているか
platform が未指定だと、以下の警告が出力されます。
[!] The `iOSEngineerCodeCheckUITests [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-iOSEngineerCodeCheck-iOSEngineerCodeCheckUITests/Pods-iOSEngineerCodeCheck-iOSEngineerCodeCheckUITests.debug.xcconfig'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.
二通りの対応が案内されています。
- 親の設定を継承する
- 設定を削除する
親の設定を継承する
target 'iOSEngineerCodeCheckUITests' do
inherit! :search_paths
設定を削除する
master の参照が残っていないか
pod repo list
を実行した時に cocoapods - Type: git (remotes/origin/master)
の部分で master の参照が残っているという警告になっています。
% pod repo list
cocoapods
- Type: git (remotes/origin/master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/ykws/.cocoapods/repos/cocoapods
trunk
- Type: CDN
- URL: https://cdn.cocoapods.org/
- Path: /Users/ykws/.cocoapods/repos/trunk
2 repos
期待する結果は次の通りです。
% pod repo list
trunk
- Type: CDN
- URL: https://cdn.cocoapods.org/
- Path: /Users/ykws/.cocoapods/repos/trunk
1 repo
pod repo remove cocoapods
を実行することで期待する結果になります。
なお、警告のメッセージには pod repo remove master
を案内されますが、
[!] Your project does not explicitly specify the CocoaPods master specs repo. Since CDN is now used as the default, you may safely remove it from your repos directory via
pod repo remove master
. To suppress this warning please addwarn_for_unused_master_specs_repo => false
to your Podfile.
これを実行すると次のようなエラーとなると思います。
% pod repo remove master
[!] repo master does not exist
参考
It has relation to this change which removes git repo and makes trunk default repository https://github.com/CocoaPods/CocoaPods/pull/8923 I have solved the problem by listing repos 'pod repo list' and then removing master 'pod repo remove' leaving only trunk
Pods ディレクトリをリポジトリに含めていないか
各環境で pod install
を実行するのであれば Pods
はその時に生成されるためリポジトリには含めないのが慣習としてあります。その場合は Git リポジトリに含めると git clone
の時に余計な時間がかかってしまいます。
もし Pods をキャッシュとして含める場合は、キャッシュとしている理由を添えて pod install
を利用しない構築を想定していると思うので、その手順が明示されているとスムーズです。