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 の設定に従って、有効なツールチェインで実行されます。