Vaporで始めるサーバーサイドSwift 〜Mac上での環境構築からHello, World!まで〜 (swiftenv, Vapor Toolboxを使用)

2017.01.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんぬづは、ドミニオンで一度も勝てたことのない田中です。

さて、今回の記事ではMac上で行うVaporによるサーバーサイドSwiftことはじめを紹介していきます。VaporというのはSwiftで書かれたWebフレームワークのことです。

今回取り扱うサーバーサイドSwiftとそれを取り巻くツールや環境は現在、発展の早いSwift界隈の中でも特に変更が多い分野となっています。この記事で紹介する方法もすぐに古くなってしまう可能性があるので、あくまで参考として見ていただければと思います。

もくじ

検証環境

  • macOS Sierra 10.12.2
  • Homebrew 1.1.7
  • swiftenv 1.2.1
  • Swift Snapshot DEVELOPMENT-SNAPSHOT-2017-01-16-a
  • Vapor Toolbox v1.0.3
  • Xcode 8.2.1

swiftenvの導入

Swiftのバージョンを管理するためのswiftenvというツールをインストールします。swiftenvを入れることで、プロジェクトごとのSwiftのバージョンを切り替えるのが楽になります。メインでiOS開発をしているけれども、サーバーサイドでは別なバージョンのSwiftを使いたい、といったときに便利です。

swiftenvがどういうものかは、Node.jsを使ったことのある方であればnvmやnodebrewのようなものと想像していただければオーケーです。

swiftenvのインストール

公式ドキュメントのVia Homebrewの項目を元にHomebrewを使ってインストール作業を行います。

$ brew install kylef/formulae/swiftenv

次にパスを通します。Bashの場合以下のコマンドを実行します。公式ドキュメントにはBash以外にも、ZSHとFishを用いる場合の方法も紹介されています。

$ echo 'if which swiftenv > /dev/null; then eval "$(swiftenv init -)"; fi' >> ~/.bash_profile

パスを通したらswiftenvのバージョンを確認して、正しくインストールされているか確認しましょう。コマンドが実行され、このmacにインストールされているswiftのバージョンが表示されていればswiftenvのインストールは完了です。

$ swiftenv versions

スクリーンショット 2017-01-17 11.30.58

任意のバージョンのSwiftスナップショットをインストールする

Swiftの公式サイト、Swift.orgのダウンロードページSnapshotsの項から任意のバージョンのSwiftのスナップショットをインストールします。今回はこの記事執筆時点での最新バージョン、January 16, 2017のDateのものをswiftenvでインストールします。

下の画像の赤枠箇所を右クリックして「リンクのアドレスをコピー」を選択します。

Swift_org_-_Download_Swift

アドレスをコピーしたらswiftenvを使ってインストールします。

$ swiftenv install <コピーしたアドレス>

今回の場合だと以下の具体例になります。

$ swiftenv install https://swift.org/builds/development/xcode/swift-DEVELOPMENT-SNAPSHOT-2017-01-16-a/swift-DEVELOPMENT-SNAPSHOT-2017-01-16-a-osx.pkg

インストールの最中にパスワードを聞かれるので入力して、成功すると以下の画像のようになります。

スクリーンショット 2017-01-17 11.59.19

ここで今インストールしたバージョンが正しくインストールされているかを確認します。

$ swiftenv versions

以下の画像のようにダウンロードしたバージョンが表示されれば完了です。

スクリーンショット 2017-01-17 12.02.18

頭に*がついているものが現在指定しているswiftのバージョンになります。一番新しくインストールしたバージョンが指定されるようですね。

使用するSwiftのバージョンを指定する

インストールされているSwiftのバージョンを切り替える方法を見ていきます。

バージョンを切り替えるには以下のコマンドを実行します。

$ swiftenv global <バージョン>

今回の場合だと、すでに先ほど確認した通りインストールしたDEVELOPMENT-SNAPSHOT-2017-01-16-aのバージョンが指定されてはいますが、あえて指定すると、

$ swiftenf global DEVELOPMENT-SNAPSHOT-2017-01-16-a

となります。

再度swiftenv versionsコマンドで見てみると、頭に*印が付いているので正しく指定されています。

スクリーンショット 2017-01-17 12.11.45

もしこれまで使っていたバージョンに戻したい場合も同じバージョン指定のやり方で戻すことができます。

Vapor Toolboxをインストールする

Vapor ToolboxというのはVaporプロジェクトに関するショートカットを提供してくれるCLIツールになります。

Homebrewを使って以下のコマンドでインストールすることができます。

$ brew install vapor/tap/toolbox

スクリーンショット 2017-01-17 13.40.12

インストールが完了したら以下の画像のようにvapor --helpコマンドを使ってその入力を受け付けてくれるかどうかでVapor Toolboxが利用可能になっているか確認しましょう。

スクリーンショット 2017-01-17 13.41.50

ここまでで環境構築は完了です。

プロジェクトを作成する

Vaporプロジェクトを作成する

次にプロジェクトを作成しましょう。プロジェクトを置いておきたい適当なディレクトリで以下のコマンドを実行します。

$ vapor new <プロジェクト名>

今回はHelloWorldProjという名前でプロジェクトを作成するので、

$ vapor new HelloWorldProj

となります。

テンプレートをもとにプロジェクトの作成が完了すると、ターミナル上にVaporのロゴがAAで表示されます。

スクリーンショット 2017-01-17 13.48.27

Xcodeを使ってソースコードを編集したい場合には

Xcode上でソースコードを編集したい場合はXcodeプロジェクトを作成する必要があります。

プロジェクトのルートにXcodeプロジェクトを作成するためにディレクトリを移動します。

$ cd HelloWorldProj

プロジェクトのルートディレクトリに移動したら以下のコマンドを実行してXcodeプロジェクトを作成します。このコマンドの実行中に "Open Xcode project?" と聞かれるので答える必要があります。yと答えるとXcodeプロジェクトの作成完了とともにプロジェクトをXcodeで開いてくれます。

$ vapor xcode

スクリーンショット 2017-01-17 13.59.03

スクリーンショット 2017-01-17 14.40.55

Hello, World!を書く

作成したVaporプロジェクトにはすでにテンプレートが作成されています。編集していくのは以下のパスにあるmain.swiftというファイルになります。

HelloWorldProj > Sources > App > main.swift

main.swiftにはすでに以下のようなテンプレート生成されたソースコードが書かれています。

import Vapor

let drop = Droplet()

drop.get { req in
    return try drop.view.make("welcome", [
    	"message": drop.localization[req.lang, "welcome", "title"]
    ])
}

drop.resource("posts", PostController())

drop.run()

細かな説明は省略しますが、ここにHello, World!を表示するための書き換えを加えます。

drop.get("hello") { request in
    return "Hello, World!"
}

これで hello というエンドポイントにアクセスすることで "Hello, World!" という文字列を返すように書き換えることができました。

もとのコードと合わせた完成形は以下になります。

import Vapor

let drop = Droplet()

drop.get { req in
    return try drop.view.make("welcome", [
    	"message": drop.localization[req.lang, "welcome", "title"]
    ])
}

drop.resource("posts", PostController())

drop.get("hello") { request in
    return "Hello, World!"
}

drop.run()

サーバーを立ち上げる

ターミナルに戻って以下のコマンドでプロジェクトをビルドします。

$ vapor build

ビルドが完了すると以下の画像のような結果が返されます。

スクリーンショット 2017-01-17 14.16.13

ビルドが完了したらサーバーを立ち上げます。

$ vapor run serve

スクリーンショット 2017-01-17 14.17.04

これでポート番号8080でローカルにサーバーを立ち上げることができました。

ウェブブラウザでサーバーを確認する

最後に、ウェブブラウザでサーバーが動作していることを確認します。0.0.0.0:8080にアクセスするとVaporがデフォルトで用意した以下の画像のようなサイトが表示されます。

スクリーンショット 2017-01-17 14.24.52

Hello, World!を表示させるには0.0.0.0:8080/helloにアクセスします。

スクリーンショット 2017-01-17 14.24.58

Done!!!

まとめ

以上、サーバーサイドSwiftの入門としてVapor, Vapor Toolbox, swiftenvの使い方を紹介しました。

手動でプロジェクトを作成して、SwiftPackageManagerを使ってVaporをインストールする方法もありますが、Vaporを扱うことに限ればVapor ToolboxがXcodeプロジェクトの作成までやってくれるのでオススメです。サーバーサイドを書くために必要なパッケージ群もまとめられているようなので、ひとまずサーバーサイドSwiftにVaporを使うのはアリではないかと私は思っています。

参考・関連