swiftenv で Swift のバージョンを切り替える

Swift プログラミング

swiftenv を使って簡単に Swift ツールチェインのバージョンを切り替えられるようにする方法です。

Kitura みたいなサードパーティーのシステムを使ったり Swift 3.0 を試したりするときに便利です。


Kitura みたいなサードパーティーのシステムを利用したり、Swift 3.0 を試すにあたって、いつでも簡単に Swift のバージョンを切り替えられたらいいなと思って、以前に @s_takeさん に教えてもらった Swift バージョンマネージャー kylef/swiftenv を OS X にインストールしてみることにしました。

swiftenv のインストール

swiftenv の README を見ると、GitHub からインストールする方法と Homebrew を使ってインストールする方法の 2 つがあるようでしたけど、後者が簡単そうなので、今回はそれでインストールすることにしました。

Homebrew のインストール方法は こちら に記載してあります。

Homebrew を使った swiftenv のインストールは次のように行います。

brew install kylef/formulae/swiftenv

そして環境設定です。自分は OS X 標準の bash を使っているので、ホームディレクトリの .bash_profile に次の環境設定を追加します。

# swiftenv
if which swiftenv > /dev/null
then
	eval "$(swiftenv init -)"
fi

そうしたら、次のコマンドを実行して .bash_profile の変更内容を反映します。

source ~/.bashrc

swiftenv を使ってみる

インストールされているバージョンを確認する

次のコマンドを実行すると、インストール済みの Swift ツールチェインのバージョンが表示されます。

swiftenv versions

たとえば swiftenv をインストールしたばかりであっても Xcode 7.3.1 がインストールされている環境で次のコマンドを実行すると次のように出力されて、Swift 2.2 が既に認識されている様子が窺えます。

* system
  2.2

アスタリスク (* ) が付けられたものが、インストールされているもののうち、使用されるツールチェインになります。

Swift ツールチェインを切り替える

swiftenv ではツールチェインを、次の2つのスコープで切り替えられるようになっています。

スコープ 詳細
global ターミナルで Swift を利用するときの、原則として使われるツールチェインです。設定は ~/.swiftenv/version に記録されるようです。
local ターミナルの現在のディレクトリー以下から Swift を利用するときに使われるツールチェインです。設定は起点となるディレクトリーの .swiftenv/version に記録されるようです。

いったん swiftenv を使って指定しておけば、全体的に使用されるツールチェイン (global) と、あるカレントディレクトリ以下で使用されるツールチェイン (local) とを自動で切り替えてくれるので このプロジェクトではこの Swift ツールチェインを使いたい みたいなことが簡単に実現できて便利です。

global ツールチェインを切り替える

global スコープの Swift ツールチェインを切り替えるには、次のようにします。

swiftenv global 2.2

たとえばこのようにすることで、原則として使用される Swift ツールチェインのバージョンが 2.2 に設定されます。

local ツールチェインを切り替える

また、たとえば DEVELOPMENT-SNAPSHOT-2016-05-09-a というツールチェインがインストールされていて、local スコープのツールチェインをそれに切り替えたい時は、次のようにします。

swiftenv local DEVELOPMENT-SNAPSHOT-2016-05-09-a

たとえばこのようにすることで、このコマンドを実行したカレントディレクトリ以下で使用される Swift ツールチェインのバージョンが 2.2 に設定されます。

この設定が優先されるので、今後もし global スコープのツールチェインを切り替えたとしても、このディレクトリー以下では影響を受けず、ここで指定したバージョンが維持されるのが嬉しいところです。

まだ global スコープのツールチェインを設定していない時に local スコープの設定を行うと、global スコープにも同じツールチェインが設定される様子でした。

新しい Swift ツールチェインをインストールする

swiftenv を使って新しい Swift ツールチェインのインストールもできます。

Swift のツールチェインは Swift.org - Download Swift で公開されています。インストールの際にはここから、インストールしたいスナップショットの URL をコピーして、それを指定してインストールします。

今回は Xcode May 9, 2016 のスナップショットの URL (https://swift.org/builds/development/xcode/swift-DEVELOPMENT-SNAPSHOT-2016-05-09-a/swift-DEVELOPMENT-SNAPSHOT-2016-05-09-a-osx.pkg ) をコピーして使うことにしました。

このときの swiftenv でのインストールコマンドは次の通りです。

swiftenv install https://swift.org/builds/development/xcode/swift-DEVELOPMENT-SNAPSHOT-2016-05-09-a/swift-DEVELOPMENT-SNAPSHOT-2016-05-09-a-osx.pkg

こうすることで、そこそこ時間はかかりましたけど Swift ツールチェインのダウンロードとインストールが行われ、今回の場合なら DEVELOPMENT-SNAPSHOT-2016-05-09-a というツールチェインがインストールされて、いつでも自由に切り替えて使えるようになりました。

このようにしてインストールした Swift ツールチェインは OS X では /Library/Developer/Toolchains ディレクトリー内に保存される様子でした。

現在有効なツールチェインを確認する

最後に、現在の swiftenv で使用する設定になっているツールチェインのバージョンを確認する方法を整理しておきます。

swift コマンド実行時に使用されるツールチェインのバージョン

swift コマンドを実行した時に使用されるツールチェインのバージョンを知りたい場合は、次のようにします。

swiftenv version

こうすることで、実際に使用される Swift ツールチェインのバージョンが表示されます。

system (set by /Users/tomohiro/.swiftenv/version)

使用されるツールチェインは global の設定と local の設定を踏まえ、現在のディレクトリーを加味して判断されています。

global として設定されているツールチェインを確認する

次のようにすることで、現時点での global スコープに設定されているツールチェインのバージョンを確認できます。

swiftenv global

このようにすると、例えば次のように、画面にツールチェインの名前が表示されます。

system

実際に swift コマンドを使う時には、基本的にはこのツールチェインが使われますけど、もし現在または上流のディレクトリーで local スコープのツールチェインが設定されていると、実際にはそのバージョンが使用されることになります。

local として設定されているツールチェインを確認する

現在のカレントディレクトリーに設定されている local スコープのツールチェインを確認するには、次のようにします。

swiftenv local

このようにすると、現在のディレクトリーに設定されているツールチェインの名前が表示されます。

DEVELOPMENT-SNAPSHOT-2016-05-09-a

ただし、注意事項として、あくまでも現在のディレクトリーに設定されているものしか見ないので注意が必要です。実際に swift コマンドを使う時には、それより上流の local 設定も加味してツールチェインが選ばれますが、このコマンドではそこまで確認されず、とにかく現在のディレクトリーに local 設定がなければ swiftenv: version is not set と報告する様子でした。

現在のディレクトリーに於いて有効なツールチェインのバージョンを知りたい場合には、少し前に紹介した swiftenv version を使用するのが良さそうです。

インストールしたツールチェインを削除するには…

インストールしたツールチェインを削除したい場合は、次のようにすれば良いらしいです。

swiftenv uninstall DEVELOPMENT-SNAPSHOT-2016-05-09-a

ただ、自分の環境でこれを試してみたところ、なぜか DEVELOPMENT-SNAPSHOT-2016-05-09-a is not installed. とレポートされてしまって削除することができない様子でした。

手作業で Swift ツールチェインをインストールしたような場合は swiftenv rehash を実行すると良いみたいな記載もドキュメントに見られましたけど、そうしてみてもうまくいかない様子でした。

とりあえず今はツールチェインを削除する必要性がないので、必要になったらまた考えてみることにします。

Swift コマンドのパスを確認する

swiftenv コマンドを、次のように実行すると、swift コマンドが実際に格納されているパスを確認することができるようになっています。

swiftenv which swift

普段はパスを指定せずに swift コマンドを使えば、何も気にせず swiftenv で有効なツールチェインにある Swift を使うことができますけど、何かの都合で現在有効な Swift のパスを取得したいときに便利だったりするかもしれません。

ちなみに "パス" で思い出した余談ですけど、テキストファイルの冒頭で #!/usr/bin/swift みたいに書いて、そのファイルに直接実行権限を与えて動かしたとき、使用される Swift は swiftenv に関係なく /usr/bin にインストールされている Swift そのものが実行されます。swift コマンドの引数としてそのファイルを渡した場合は swiftenv の設定に従って、有効なツールチェインで実行されます。