『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

ここにResourceKitを使っている時に外部ライブラリをimportさせたい人がいます

はじめに

ResourceKitはこちら。Starあげるとbannzaiさんがとっても喜ぶと思います!

github.com

タイトルが思いつかなかったので、いまいちですが、大まかにやりたいことは以下です。

  • Git管理されたiOSアプリのプロジェクトがあります
  • 内部では ResourceKit を使用しています
  • ResourceKit で書き出された Resource.generated.swift.gitignore に記述されGit管理されていない
  • 外部ライブラリ(今回の例: TPKeyboardAvoiding )を使っている時に import Hoge を記述しないといけない
  • Resource.generated.swift はGit管理されていないので作られてコンパイルされる前にライブラリを import してあげる

今回使用した外部ライブラリは以下です。いつもお世話になっております。(PRも作ってマージされた経験あり)

github.com

環境

私は、こういうのにシェルスクリプトとかSwiftで対抗できる手段がないのでPythonでやってやろうと思います。
Bitrise等のCIが通るかは分かり兼ねますが、Python2でも一応動くソースコードにしてると思うのでPython2が動く環境であれば大丈夫と思う。

プロジェクト作成

CocoaPodsなプロジェクトを作るところまでは飛ばします。

今回の Podfile は以下のようにしました

platform :ios, '11.2'

target 'sample' do
  use_frameworks!

  pod 'ResourceKit'
  pod 'TPKeyboardAvoiding'
end

お前、それRubyじゃん!死んでも書かないんじゃなかったの!?(煽り

こう思われる方もいらっしゃるでしょう。 PodfileRubyじゃない!!!!!!!!(思い込みで成り立つ

$ pod setup
$ pod install

これでインストールできたらとりあえず ResourceKit のREADME.mdに従って、 Run Script を作って、ビルドしてみましょう。普通に通るはずです。
Run Script の順番は Compile Sources の直前がいいかなって思います。

f:id:nanashinodonbee:20180411194545p:plain

hoge.xcworkspace 等と同じディレクトリに Resource.generated.swift ができてるので、Xcodeで管理するようにドラッグアンドドロップ

外部ライブラリの準備

ResourceKit と一緒にインストールした TPKeyboardAvoiding を使用します。
他のUI系のライブラリ使った時も同じようなことができると思うので、それでやっていきます。

SecondViewController.swiftSecondViewController.xib を作りました。
IB上で UIScrollView を配置してそのCustom classを TPKeyboardAvoidingScrollView としておきます。
ついでに SecondViewController と紐付けもしておきましょう。

f:id:nanashinodonbee:20180411195050p:plain

こんな感じで。( import TPKeyboardAvoiding を忘れずに)

んで、ビルドしてみましょ

エラー

ここで Resource.generated.swift に対してエラーが出てくるはず。

f:id:nanashinodonbee:20180411200106p:plain

ResourceKit のREADME.mdの下の方のHelpにこんなことが書いてありました。

f:id:nanashinodonbee:20180411195305p:plain

要は手動で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'] というような感じで追加してみてください。複数ある時は、よくある配列の形で追加するといけます。

f:id:nanashinodonbee:20180411200010p:plain

あとは、 Run Script を作って以下みたいに配置。 もちろん Compile Sources の直前

f:id:nanashinodonbee:20180411200440p:plain

python $SRCROOT/script/generated_resource.py

最後にビルド!

おわり

最後に

この操作が、Swiftで書けるようになったらいいんですけどね。そんな力はないのでPython様に頼りました。
iOSに関係するものはPythonで書きたい!っていう欲もあるのでいい機会でした。

さてこれを業務で使わせて頂けるのか...

語り忘れていたんですが、 Resource.generated.swift をGit管理したらええやんって感じの話はありますが、コンフリクトしなくてもいいファイルがコンフリクトするのは解せないのです。
このファイルは一定以上のソースは自動生成されるのでわざわざGit管理する必要がないと思ったからです。