[Swift] Swiftで簡単なCLIを作ってみる (その1)
はじめに
CX事業本部の中安です。
今日のお話は、手作業でやるには面倒くさいようなローカルマシン上で行いたい処理を、どうにか機械的にプログラマブルにできないものかなぁと考えだしたところから始まります。
で、なんとなく「コマンドラインツールみたいなのを作れないかなぁ」という案が思い浮かんできました。
お手製でコマンドラインツールを作るには色々と方法があるとは思いますが、自分が扱うのに手慣れたSwiftで作る方法を調べてみると、それっぽいものができてきたのでブログにしたためておこうかと思います。
「それ、シェルスクリプトのほうが良くない?」などのご感想を持つことかとは思いますが「Swiftでやってみたかった」という思いのもとやってみたものなので、ご了承いただればと思います m(_ _)m
ちなみに参考としてCLIとは コマンドラインインターフェイスのことです
すごくシンプルなやつを作ってみる
まずはすごくシンプルなCLIツールを作ってみようということで
- ファイルを引数に渡すと、その場所を絶対パスで返す
という「そんなのわざわざコマンドにする?」というものを作ってみようかと思います。
前提
swift
コマンドが打てることが前提です。
iOSアプリ開発のためにXcodeをインストールしていれば、使えるようになっているかと思います。
こちらのコマンドを打ってみて swiftのバージョンが表示されればOKかと。
$ swift -version
まだ入ってない場合は先に入れておいてください。そちらに関しては今回は割愛します。
下準備
まず作業場としてディレクトリを掘ります。場所は適当でいいです。
絶対パスを返すということで absolutepath
という名前をつけてますが、こちらも適当でいいです。
$ mkdir absolutepath
で、そこに移動します
$ cd absolutepath
Swiftファイルを作成します
$ touch main.swift
このディレクトリに適当なファイルを移動させてきてください。
今回はsample.csv
というCSVファイルを移動させてみましたが、ファイル形式もファイル名も適当でいいです。
実装
作ったswiftファイルはこのように書きます
import Foundation let currentDir = FileManager.default.currentDirectoryPath let argument = CommandLine.arguments.dropFirst().first ?? "" let result = (currentDir as NSString).appendingPathComponent(argument) print(result)
書いてあるソースコードを簡単に説明すると
まず、FileManager.default.currentDirectoryPath
で実行しているディレクトリの場所を取得しています。
続いてCommandLine.arguments
ですが、渡されたパラメータ(引数)を取得する処理になります。
dropFirst()
をしているのは、arguments
の戻り値の配列の先頭にコマンド文字列そのものが渡されてくるからです。
sample.csv
という文字列を得るには、先頭要素を削いでから、その先頭を取得する必要があります。
(パラメータが渡されないことも考慮して、なければ空文字にするという処理も入れています)
あとは文字列結合して print しているだけです
実行
この swiftファイルを実行するには下記のようにコマンドを打ちます。 実行するファイルの後に引数を渡すことができます。
$ swift main.swift sample.csv /Users/(..省略..)/absolutepath/sample.csv
上のように sample.csv
の絶対パスが表示されたでしょうか
コンパイル
swiftc
コマンドで、今作ったシンプルなツールを実行ファイルにしてみたいと思います。
それを /usr/local/bin/
以下に置くことで、ローカルマシンのどこでも使えるようにしてみます。
(とりあえずお試しなので、直接配置します)
$ swiftc -o abpath main.swift $ cp -f abpath /usr/local/bin/
または
$ swiftc -o /usr/local/bin/abpath main.swift
今回は打ちやすいように abpath
という実行ファイルにしてみました。
使ってみる
$ abpath sample.csv /Users/(..省略..)/absolutepath/sample.csv
同じ結果が得られたと思います。
最後に
今回はすごくシンプルなCLIツールを作ってみました。
次はもう少しバージョンアップさせてみたいと思います。