【part 8】AppApp のリファクタリング過程紹介【Carthage/LicensePlist編】

どうも。Reoです。うるおいらんどの管理人です。毎度名乗ってるけど、1人ぼっちのブログですよ。パート8にもなって何言ってるんだ。

今回で環境構築編っぽいものを終えられるはずと思っています。今回こそサクッと終わらせるぞ。

前回の記事投稿後のオフ作業で色は全てNamedColorに変更しました。(今回出てこないけど)

 

環境

  • Xcode11.3.1
  • Swift 5.1.3
  • iOS13.3
  1.  AppApp のリファクタリングを始めます!【SwiftLint 導入編】
  2. 【part 2】AppApp のリファクタリング過程紹介【SwiftLint導入後のError解消編】
  3. 【part 3】AppApp のリファクタリング過程紹介【SwiftLint導入後のWarning解消編】
  4. 【part 4】AppApp のリファクタリング過程紹介【コーディング規約編】
  5. 【part 5】AppApp のリファクタリング過程紹介【ディレクトリ構成編】
  6. 【part 6】AppApp のリファクタリング過程紹介【R.swift導入編】
  7. 【part 7】AppApp のリファクタリング過程紹介【画像・色の管理編】

 

リポジトリ→ uruly/AppApp

 

今回の目標

すでに Carthage は使っているんですが、それを Mint を用いた方式に変更していこうと思います。

ついでに使わないライブラリは消します。

あと、書いてみたら結構短かったので、LicensePlist も導入しちゃいました。

 

MintでCarthageを導入

Mint でCarthageを入れ直していきます。

vi Mintfile

/* Mintfile内 */
Carthage/Carthage@0.34.0
mac-cain13/R.swift@v5.1.0
realm/SwiftLint@0.39.1

Carthageを追加しました。

mint bootstrap
// 確認
mint list

MintでCarthageが入りました。

 

現在のCartfile

さて。現在のCartifileの中身を見ましょう。

github "realm/realm-cocoa"
github "akashivskyy/GoogleAnalytics-Framework"

なんも入ってないですね。はい。

とりあえず、GoogleAnalyticsは消します。リリースを諦めたものですし、いれててもしょうがないので。というか色々設定ファイルあげてるのがだいぶまずい。

先にその辺を削除しておきます。

削除してきたので、Carthageで扱っているのはRealmだけになりました。現在はRealmはMint対応してないことを確認したので、このままCarthageで入れていきます。

Cartifle自体はそのままでおkです。

mint run carthage update --platform iOS --no-use-binaries

// Cartfile.resolved をもとにするなら
mint run carthage bootstrap --platform iOS --no-use-binaries

で。

1人のプロジェクトだと何も変わらない気がしますね。複数人だと、Mint で Carthageのバージョンを揃えてあげることができます。

 

xcfilelistで管理

AppAppでは、Run Script Phase の Input Files に各フレームワークを書いていました。

それを、xcfilelist の方にかけるようにします。

 

File > New > File より Carthage.xcfilelist を追加します。

んで、Carthage.xcfilelist の中に以下のように書きます。

$(SRCROOT)/Carthage/Build/iOS/Realm.framework
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework

 

Run Script Phases の Input File Lists の 部分には Carthage.xcfilelist を指定します。

あと、Script部分も mint に合わせて mint run carthage copy-frameworks にする必要があります。

 

本当を言うと自動化したいし、自動化できる部分なんですけどね。

Carthage使用時のcopy-frameworksでのinputfiles、outputfilesの指定を簡易化する

 

Shellとかも勉強したいなぁ…

 

LicensePlistの導入

次パートで書こうかと思ったけど、思ったより短かったのでサクッとLicensePlistをいれちゃいます。

 

LicensePlistとは

license-plistというCLIツールを実行すると、そのプロジェクトで依存しているライブラリを収集して、iOS設定アプリ上に載せられる形式のplist群を生成します。

https://medium.com/swift-column/license-plist-c0363a008c67

詳しくは、LicensePlist というiOSアプリ利用ライブラリのライセンス一覧を生成するツールを作りましたを読みましょう。

これも仕事をして初めて知りました。仕事で作っていたプロジェクトの設定画面で見つけた時にナニコレすごい…っていう出会いでした。元々ライブラリ自体をほとんど使わないので、そういうことに疎すぎる…。

 

Mintで導入

Mint 対応しているので入れていきましょう。

vi Mintfile

/* Mintfile内 */
Carthage/Carthage@0.34.0
mac-cain13/R.swift@v5.1.0
mono0926/LicensePlist@2.13.0
realm/SwiftLint@0.39.1

mono0926/LicensePlist を追加して mint bootstrap を行います。

そしたら、Run Script Phase の方に書いていきます。

if mint list | grep -q "LicensePlist"; then
  if [[ $CONFIGURATION = "Debug" ]]; then
      mint run LicensePlist license-plist --output-path ${SRCROOT}/AppApp/Resources/Settings.bundle \
      --prefix xyz.uruly.AppApp \
      --suppress-opening-directory \
      --force
  fi
else
  echo "error: LicensePlist not installed; run 'mint bootstrap' to install"
fi

 

⌘+Shift+Bで解析してやると指定したフォルダに Settings.bundle ができます。

Xcode上でも追加してあげます。

Copy items if needed のチェックはオフにして Resources 以下に追加。

Settings.bundle 以下に Root.plist を作成します。

以下のように設定しました。

Item 0 に先ほど LicensePlist によって生成されたファイルを指定しています。

Item 1 についでにコピーライトを追加しました。

 

これで設定アプリで無事項目が追加されたのが確認できました。

いぇい。これでライブラリを追加した時には自動でライセンス表記が生成されるようになったハズ。

ハズ?あれ?

LicensePlist 本体のライセンスがないので何かが足りない。Mintで入れている部分が足りない…!

 

手動で追加

むむぅ。

https://github.com/mono0926/LicensePlist/blob/master/Tests/LicensePlistTests/Resources/license_plist.yml を見ながら。

license_plist.yml を Resources 以下に追加しました。

github:
  - owner: mac-cain13
    name: R.swift
    version: v5.1.0
  - owner: mono0926
    name: LicensePlist
    version: 2.13.0
  - owner: realm
    name: SwiftLint
    version: 0.39.1
  - owner: yonaskolb
    name: Mint
    version: 0.14.1
  - owner: Carthage
    name: Carthage
    version: 0.34.0

RunScriptPhasesの方に --config-path ${SRCROOT}/AppApp/Resources/license_plist.yml を追加しました。

if mint list | grep -q "LicensePlist"; then
  if [[ $CONFIGURATION = "Debug" ]]; then
      mint run LicensePlist license-plist --output-path ${SRCROOT}/AppApp/Resources/Settings.bundle \
      --config-path ${SRCROOT}/AppApp/Resources/license_plist.yml \
      --prefix xyz.uruly.AppApp \
      --suppress-opening-directory \
      --force
  fi
else
  echo "error: LicensePlist not installed; run 'mint bootstrap' to install"
fi

⌘+Shift+Bで解析。生成おk。

できた。ふぃー。

 

これ実は自動でなんかしてくれる方法あるのかな。わからん…。そもそもの何かが間違っている気しかしない…。

 

次回

次回。次回。どうしよう。何から手をつけよう。

ホーム画面から行きたいところだけれど、難しい。それともRealmのObjectをどうにかしてからやるか…。

どこからやっても重いんですよね。きつい。でもRealm周りからやった方がいい気がしてるので、その辺からですかねーー。

 

おわりに

ライブラリを入れたり、ファイルの管理方法を変更したり、そういうことをするのは今回でひとまず終了です。入れたくなったら都度入れます。

 

こうやってリファクタリングを始めて、レビューをするのってかなり大変だなってヒシヒシと感じています。

あまりにも酷いコードってどこから手をつけていいかわからないし、指摘をするにも限界がある。最初からではなく、出来上がっているもののコードを良くしようとするのは特に大変なんですよね。あるものを良くしないといけない…。厳しい…。つらい…。いつもありがとう…。

だからこそ、ちゃんと普段から意識して最善のコードを書けるようにしたいですね。

 

その時一番良い方法だと思っていても、知識が増えていって、どんどん書き方が変わっていくことはいいことだと思うんですよ。この AppApp でさえ、当時上手く書けていると思っていたはずなんです。

リファクタリング過程は記事として残しておくけれど、1年後にはもう古い書き方になってしまったり、良くない方法だと気づいたりすることになると思っています。特に、アプリはナマモノだと思っているので。

是非、美味しいと思ったところだけ拾ってください。

 

ではでは。次回は明日にしたいけれど、休日なので休むかもしれないです。

 

AppApp ,
コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

Related Memo...

UITableView.RowAnimation の .none はアニメーションするよ

UITableView.RowAnimation の .none はアニメーションがnoneなわけじゃなく、デフォルトの設定を使うよという意味らしい。

The inserted or deleted rows use the default animations.

なのでアニメーションしちゃう。今更の気づき。

 

iOS

UINavigationController + UIScrollView の組み合わせで使っている時に謎の余白ができる時

UINavigationController + UIScrollView の組み合わせで使っていて、UIScrollView 上に AutoLayout で上下左右0で View を設置しているのに、30px程度上にずれてしまうとき。

`navigationController.navigationBar.isTranslucent = false` にすると直るかもしれない。

ScrollView上のコンテンツとNavigationBarの重なっているところが透過していたら多分これで直せるはず。

通常のターゲットではちゃんと動いているのに、iOSSnapshotTestCase を用いたテストでだけこの対応が必要なのよくわからないけれど。。。

iOS

記事を書くほどでもないけれどメモっておきたいこと

テスト投稿。

例えばiphone7 の画面サイズ

750 × 1334
半分375 × 667

iOS
more