[Swift] Swiftで簡単なCLIを作ってみる (その1)

2019.12.10

はじめに

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ツールを作ってみました。

次はもう少しバージョンアップさせてみたいと思います。