Subscribed unsubscribe Subscribe Subscribe

JPMartha's Pancake

This blog is the way to brush up my poor English.

コマンドラインツールについて調べたこと 🙋

Swift Xcode OS X

このブログは英語で書く方針でしたが今回は諸事情で日本語です。

内容は最近Qiitaで投稿されたものと同様ですが、自分は少し違うアプローチをしていました。

Qiitaに後追い投稿するのもなんだか気が引けるのでここで細々と書きますね! 😭

第1部:ミニマムスタート

小さなことからコツコツと。

まず簡単なコマンドラインツールを実行して喜びましょう 🙌

Command Line Tool 作成

  • Xcode を起動して File → New → Project で「Command Line Tool」を選択します。

f:id:JPMartha:20160214113029p:plain

  • なんでもよいですが例として「chocolate」を作成します。

    chocolate コマンドで実行させる甘いプラン 😏)

f:id:JPMartha:20160214113300p:plain

  • とりあえず Git はなしであとから設定します。

f:id:JPMartha:20160214113420p:plain

main.swift が生成されます。

print("Hello, World!")

ド定番の Hello, World! が出力されそうなプログラムですね。

少しだけ変えてみましょう。

print("Can I have a chocolate?")

ビルドしてファイルをコピー

  • ビルドします。

  • Products の chocolate が生成されますのでこれを /usr/local/bin にコピーします。

f:id:JPMartha:20160214113601p:plain

いよいよ実行

  • ターミナルを起動して $ chocolate コマンドを実行します。

f:id:JPMartha:20160214120552p:plain

Can I have a chocolate? が表示されましたね 🎊

🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫 🍫

🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌

第2部:フレームワーク搭載

次に少し手を広げます。

Carthage などのコマンドラインツールCommandant というライブラリを使用していますが、それを使わずに試した内容を紹介します。

ここはもう少し深掘りしたいところですが自宅のネット回線が障害で使えない(言い訳)ので雑になっています 🙇

需要があれば補足と続編を書きます。

☕️追記:この時点では Carthage などで利用されている xcconfigsMakefile を利用していませんがそれらを利用することでうまい具合に設定できます。

使用ライブラリ

フレームワーク作成

f:id:JPMartha:20160214123349p:plain

ここで Git を 使用します。

f:id:JPMartha:20160214193412p:plain

ターゲット作成

コマンドラインツールのまま試しましたがフレームワークを読み込めなかったため、とりあえず新規にターゲットを作成します。

main.swift はここに含めます。

f:id:JPMartha:20160214192940p:plain

f:id:JPMartha:20160214193101p:plain

Carthage 設定

  • Cartfile を作成します。
github "ishkawa/APIKit"
github "ikesyo/Himotoki"
  • carthage update を実行します。
$ carthage update --use-submodules --platform mac

説明をかなり端折りますがこのような構成にしています。

f:id:JPMartha:20160214193320p:plain

Build Settings 変更

フレームワーク( ChocolateKit )側

Runpath Search Paths (LD_RUNPATH_SEARCH_PATHS)
  • デフォルト

    • $(inherited)
    • @executable_path/../Frameworks
    • @loader_path/Frameworks
  • 変更後

    • $(inherited)
    • @executable_path/../Frameworks
    • @loader_path/../Frameworks

参考:xcconfigs ではこのように設定されています。

  • Application.xcconfig

LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks @loader_path/../Frameworks @executable_path/Frameworks

  • iOS-Base.xcconfig

LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks

  • Mac-Base.xcconfig

LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks

Dynamic Library Install Name (LD_DYLIB_INSTALL_NAME)
  • デフォルト

    • $(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)

      これは @rpath/PancakeKit.framework/Versions/A/PancakeKit です。

  • 変更後

    • @rpath/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/$(PRODUCT_NAME)

      これは @rpath/PancakeKit.framework/PancakeKit です。

これをしないと下記のエラーになります。

dyld: Library not loaded: @rpath/libswiftAppKit.dylib
  Referenced from: /usr/local/bin/chocolate
  Reason: image not found
Trace/BPT trap: 5

☕️追記:ならなくなりました…😅

参考:xcconfigs ではこのように設定されています。

  • Framework.xcconfig

LD_DYLIB_INSTALL_NAME = @rpath/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/$(PRODUCT_NAME)

コマンドラインツール( chocolate )側

Runpath Search Paths (LD_RUNPATH_SEARCH_PATHS)
  • デフォルト

    空欄

  • 変更後

    • @executable_path/.
    • @executable_path/ChocolateKit.framework/Versions/Current/Frameworks
    • /Library/Frameworks
    • /Library/Frameworks/ChocolateKit.framework/Versions/Current/Frameworks
    • $(inherited)

参考:xcconfigs ではこのように設定されています。

  • Application.xcconfig

LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks @loader_path/../Frameworks @executable_path/Frameworks

  • iOS-Base.xcconfig

LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks

  • Mac-Base.xcconfig

LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks

Build Phases 設定

フレームワーク( ChocolateKit )側

f:id:JPMartha:20160214212624p:plain

f:id:JPMartha:20160214212634p:plain

コマンドラインツール( chocolate )側

f:id:JPMartha:20160214212600p:plain

f:id:JPMartha:20160214212609p:plain

ビルドしてファイルをコピー

  • ビルドします。

  • Products に生成されるファイルをそれぞれコピーします。

    • chocolate.app/Contents/MacOS/ chocolate → /usr/local/bin
    • ChocolateKit.framework → /Library/Frameworks

実装

コマンドラインツール側でフレームワークをインポートすることでライブラリを呼び出せるようになります。

import ChocolateKit

以下大幅に省略

時間切れです!とりあえず公開してちょいちょい補足するかもしれません 🙇

☕️追記:中途半端すぎたのでとりあえず HimotokiJSON をデコードするツールにしてみました。

f:id:JPMartha:20160215211813g:plain

おまけ

関西モバイルアプリ研究会(関モバ)#10 で発表したネタに関連するのですが、SourceKitten をベースに Markdown形式 のドキュメント生成ツールを作成中です。

こちらは CommandantxcconfigsMakefile を利用しています。

github.com