はじめに
ResourceKitはこちら。Starあげるとbannzaiさんがとっても喜ぶと思います!
タイトルが思いつかなかったので、いまいちですが、大まかにやりたいことは以下です。
- Git管理されたiOSアプリのプロジェクトがあります
- 内部では
ResourceKit
を使用しています ResourceKit
で書き出されたResource.generated.swift
は.gitignore
に記述されGit管理されていない- 外部ライブラリ(今回の例:
TPKeyboardAvoiding
)を使っている時にimport Hoge
を記述しないといけない Resource.generated.swift
はGit管理されていないので作られてコンパイルされる前にライブラリをimport
してあげる
今回使用した外部ライブラリは以下です。いつもお世話になっております。(PRも作ってマージされた経験あり)
環境
私は、こういうのにシェルスクリプトとかSwiftで対抗できる手段がないのでPythonでやってやろうと思います。
Bitrise等のCIが通るかは分かり兼ねますが、Python2でも一応動くソースコードにしてると思うのでPython2が動く環境であれば大丈夫と思う。
プロジェクト作成
CocoaPodsなプロジェクトを作るところまでは飛ばします。
今回の Podfile
は以下のようにしました
platform :ios, '11.2' target 'sample' do use_frameworks! pod 'ResourceKit' pod 'TPKeyboardAvoiding' end
お前、それRubyじゃん!死んでも書かないんじゃなかったの!?(煽り
こう思われる方もいらっしゃるでしょう。 Podfile
はRubyじゃない!!!!!!!!(思い込みで成り立つ
$ pod setup $ pod install
これでインストールできたらとりあえず ResourceKit
のREADME.mdに従って、 Run Script
を作って、ビルドしてみましょう。普通に通るはずです。
Run Script
の順番は Compile Sources
の直前がいいかなって思います。
hoge.xcworkspace
等と同じディレクトリに Resource.generated.swift
ができてるので、Xcodeで管理するようにドラッグアンドドロップ。
外部ライブラリの準備
ResourceKit
と一緒にインストールした TPKeyboardAvoiding
を使用します。
他のUI系のライブラリ使った時も同じようなことができると思うので、それでやっていきます。
SecondViewController.swift
と SecondViewController.xib
を作りました。
IB上で UIScrollView
を配置してそのCustom classを TPKeyboardAvoidingScrollView
としておきます。
ついでに SecondViewController
と紐付けもしておきましょう。
こんな感じで。( import TPKeyboardAvoiding
を忘れずに)
んで、ビルドしてみましょ
エラー
ここで Resource.generated.swift
に対してエラーが出てくるはず。
ResourceKit
のREADME.mdの下の方のHelpにこんなことが書いてありました。
要は手動でimport書いてね
出番やな
#!/usr/bin/env python # coding: utf-8 """ This script file automatically inserts the import of the libraries used for 'ResourceKit'. Insert new 'Run Script' before 'Compile Sources' in Build Phases. And fill this code. python $SRCROOT/script/generated_resource.py """ import os.path # Fill your using libraries libraries = [] generated_file = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'Resource.generated.swift') output = '' with open(generated_file, 'r') as f: for line in f.readlines(): if line.startswith('import'): if line == 'import UIKit\n': output += line + '\n'.join(map(lambda item: 'import {}'.format(item), libraries)) + '\n' elif line.replace('import ', '').replace('\n', '') in libraries: continue else: output += line with open(generated_file, 'w') as f: f.write(output)
ちなみにこっちにGistが
External library automatic input script to ResouceKit. · GitHub
こんなソースコード書いてみました。
スクリプト自体は、 Resource.generated.swift
のあるフォルダに script
という新しいフォルダを作ってそこに generated_resource.py
という名前で配置しました。
16行目を libraries = ['TPKeyboardAvoiding']
というような感じで追加してみてください。複数ある時は、よくある配列の形で追加するといけます。
あとは、 Run Script
を作って以下みたいに配置。 もちろん Compile Sources
の直前
python $SRCROOT/script/generated_resource.py
最後にビルド!
おわり
最後に
この操作が、Swiftで書けるようになったらいいんですけどね。そんな力はないのでPython様に頼りました。
iOSに関係するものはPythonで書きたい!っていう欲もあるのでいい機会でした。
さてこれを業務で使わせて頂けるのか...
語り忘れていたんですが、 Resource.generated.swift
をGit管理したらええやんって感じの話はありますが、コンフリクトしなくてもいいファイルがコンフリクトするのは解せないのです。
このファイルは一定以上のソースは自動生成されるのでわざわざGit管理する必要がないと思ったからです。