LoginSignup
7
7

More than 5 years have passed since last update.

Xcodeを利用したツールを作りましたのでご紹介(仮)

Posted at

Swift 愛好会

今日のアジェンダ

  • 自己紹介
  • 雑談
  • 今日も何か作ってきたの?
  • Xcodeでコマンドラインツールの作り方

自己紹介

name: 廣瀬 雄大
github: https://github.com/bannzai/
qiita: https://qiita.com/bannzai/

あだ名: star乞食
口ぐせ: starください

Swift愛好会ではOSSを自作して紹介しています。

star ください


前回紹介したOSS(雑談)

前回 Kaeru と言う自作OSSを紹介させていただきました。
qiita: 🍎が好きすぎてiPhoneで使われているあのUIを再現してみた
github: Kaeru

なんとこの発表をきっかけに順調にstarが伸びていき


















300 star超え達成しました!!















  
  
   
  
  
  

starをしてくださった皆様ありがとうございます











  
  

いえーいぱふぱふ



















  
  
  
  
  
  
  

まだの人はstarください

今日も何か作ってきたの?

実はまだ作成途中なので今日はこんなものを作りたかった
と言う内容で発表させてもらおうかなと思います。

なので、今日は
PR乞食になります  
PRください

作っている途中のリポジトリはこちら

作りたかったもの

今回はコマンドラインからXcodeを使用せずにディレクトリ等を操作するツールを作ろうと思っていました。

名前は仮でxcpとしています。

下記に一例(妄想)をあげます。

project.pbxprojで管理しているファイル一覧
$ xcp paths
/develop/swift/project/ProjectTests/Tests.swift
/develop/swift/project/ProjectTests/Info.plist
/develop/swift/project/Project/AppDelegate.swift
/develop/swift/project/Project/ViewController.swift
/develop/swift/project/Project/Info.plist
/develop/swift/project/ProjectUITests/Info.plist
/develop/swift/project/Project/Project-Bridging-Header.h
/develop/swift/project/Project/Assets.xcassets
...
ファイルを新規作成してproject.pbxprojにもaddする
$ xcp add --create /develop/swift/project/SecondViewController.swift
...
ファイルをrmしてproject.pbxprojからも消す
$ xcp rm /develop/swift/project/SecondViewController.swift
...
project.pbxprojで管理しているstruct一覧
$ xcp find --struct "hogehoge"
/develop/swift/project/Project/hogehoge.swift struct hogehoge
struct の名前をreplaceする(難しそう)
$ xcp refactor --replace-name --struct --filename "hogehoge" "fugafuga"
/develop/swift/project/Project/fugafuga.swift struct fugafuga
/develop/swift/project/Project/ViewController.swift fugafuga()

と、コマンドから色々操作できたら
IDEに縛られず処理を書くことできそうだなと思っています。

Xcodeでコマンドラインツールの作り方

僕自身がIDEしかあまり知らずにプログラマとして育っていきました。
最近はCUI環境での開発も行っていますがやはりIDEだけを触っていたら
得られないものがあります。

コマンドラインツールに魅力を感じつつも
なかなか踏み切れない人の助力となればいいなと思います。

今回紹介するのはXcodeというIDEを使用した
コマンドラインツールとなります。
作ったツールはターミナル等からshellを介して実行できます。

make等を使用した開発もやったほうがいいでしょうが、
とっかかりとしていつも使っているツールから入れたら十分だと思います。

今回は標準入出力まで行えるところを確認しましょう。

作り方
1: Xcodeでコマンドラインツールを作成
Xcodeから新規でプロジェクト作成

image

macOSからCommand Line Toolを選択し進む
例ではDemoというプロジェクト名で作りました。

2: main.swiftHello worldが書かれているのでビルドして実行ファイルを作る


import Foundation

print("Hello, World!")

image

ビルドしたら実行ファイルができておりターミナルで実行ファイルがある場所にcdしましょう

~/Library/Developer/Xcode/DerivedData/Demo-fgvorkhdvjwlgrgkalyitrwhkezn/Build/Products/Debug/

上記のようなディレクトリにあります。
そこで./Demoと入力しEnterを押せば
Hello, worldと表示されます。

$ ./Demo
Hello, world

3: 標準入出力
標準出力はmain.swiftからも分かる通り
printで出力されます。

入力はコマンドの後にスペース区切りで渡すことができます。
例えばpathsという入力をDemoに渡す場合は
$ ./Demo paths
でいいでしょう。

入力をコードから利用する場合は

ProcessInfo.processInfo.argumets

から先ほどであればpathsという文字を取得することができます。
本当に受け取れているかどうかを出力してみましょう
main.swiftを書き換えてビルドします。

let isExists = ProcessInfo
    .processInfo
    .arguments
    .contains{ $0 == "paths"}

print("is exists path? : \(isExists)")

ターミナルに戻り

$ ./Demo 
is exists path? : false
$ ./Demo paths 
is exists path? : true

これで入力が渡ったことが確認できました。
あとは渡ってきたパスによって処理を分岐させれば
自分の作りたいツールができます。やったね

他にもプロジェクトからbashコマンドを叩いてその標準出力を取得してどうこうといったこともできます。

xcpでもやっている場所があるので詳しくはここら辺とかを見てください。

注意点としてはまだswift 2.3として書いています。

ちなみにxcpは後どれくらいでできそう?

だいぶ時間かかりそうなのでのんびり開発していこうかなと思います。

一番の課題は実行時にproject.pbxprojの情報をいちいち読んでいるからか
無駄な計算があるのか、コマンドラインツールとしては致命的に遅いです。

なので
PRや意見をお待ちしております。

おしまい\(^o^)/

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7