髪も切れるiOSエンジニアのブログ

元美容師エンジニアの成長と奮闘の記録

ビルド環境切り替え Cococapodsを含めて環境別スキーム追加

担当案件のフルリファクタリングをしているのだが、ビルド環境を切り替えるためにいちいちソースコードコメントアウトを書き換えて行なっているヒューマンエラー紙一重の現状を改善すべく、環境別にスキームを追加することとなった時の話。スキームの追加は簡単だしそれぞれのスキーム設定の追加も難なくできたのだが、Cocoapodsでライブラリをインポートしていたためにつまづいた。同じような経験をした人は多いのではないだろうか。
スキーム追加の参考記事はたくさんあるのだが、Cocoapodsへの対処法の記事は存在しなかったので備忘録を兼ねて。

環境

Xcode 8.3.2
Cocoapods 1.1.1

概要

  • スキームの追加
  • Build Configurationの追加
  • Preprocessor Macrosの追加
  • Other Swift Flagsの設定
  • Cocoapodsの再インポート

スキームの追加

前提として既にCocoapodsによって何らかのライブラリをインポートしているプロジェクトを想定して進める

ビルドターゲットを切り替えるところからManage Schemesを選択
f:id:Tansok:20170615013048p:plain


自分のプロジェクトを選択した状態で、Duplicateを選択
f:id:Tansok:20170615013645p:plain

任意のスキーム名を設定
f:id:Tansok:20170615013852p:plain

これでビルドターゲット欄に自分が入力した名前のスキームが追加される

Build Configurationの追加

Project → Info → Configurationsと選択し、もともと用意されているDEBUGを選択する
f:id:Tansok:20170615014429p:plain

「+」ボタンを押してDuplicate "Debug" Configurationを選択
f:id:Tansok:20170615014703p:plain

コピーが作られるので任意の名前を設定する
f:id:Tansok:20170615014839p:plain

ビルドターゲット選択エリアからEdit scheme...を選択
f:id:Tansok:20170615015025p:plain

はじめに作ったスキームであることを確認し、Build Configurationをさっき作ったものを選択
f:id:Tansok:20170615015331p:plain

Preprocessor Macrosの追加

Targets → Build Settings → Preprocessor Macrosの自分でさっき追加した項目を選択
f:id:Tansok:20170615015907p:plain

$(inherited)を削除し、[任意の名前]=1を入力します。
f:id:Tansok:20170615020341p:plain

Other Swift Flagsの設定

Targets > Build Settings > Other Swift Flagsと選択
f:id:Tansok:20170615020628p:plain

Other Swift Flagsを展開して下の画像のように追加
f:id:Tansok:20170615021016p:plain


これでスキームの追加と各種設定は終了。
一応動作確認の例としては下記

#if DEVELOP
    print("Develop環境")
#else
    print("他の環境")
#endif

しかしこれだけではだめ。はじめに言ったように
既存のライブラリやフレームワークが読み込まれていないことになってる
f:id:Tansok:20170615021724p:plain

Cocoapodsの再インポート

ここからが本題

一旦Podfile内のpodsの文「pod 'Alamofire'」とかの全てコピーをとっとく
そして
Pods関連のファイルを全て削除。さあ、勇気を振り絞って!
f:id:Tansok:20170615022057p:plain

そして

$pod init

$vim Podfile

コピーとっておいたpodsの文を貼り付けて保存

$pod install

ここまでやったら改めて動作確認
f:id:Tansok:20170615023010p:plain

拍手!

まとめ

きっと正攻法ではないのはわかっている。ライブラリのバージョン指定をしていなければ、予期せぬバージョンアップが実行されてしまうしね。
でも自分の環境では今でも健康に動いているので、一つの得策として役に立てればと思う。