【Swift】サーバーサイドSwift 〜Vapor 始めの第一歩〜【Vapor v0.13】

サーバーサイドSwiftのフレームワークの一つである **Vapor** をはじめてみようと思うので、手順を書き残そうと思います。

[こちらの記事](http://qiita.com/taji-taji/items/f679f46bb565e5f47044)を書いた2日後に、v0.12 から **v0.13** のドキュメントに更新されていたので、v0.13用のドキュメントに従ってやってみました。

今回はハマることもなく非常に簡単に試すことができました。

# 環境

- OS X: 10.11.5（15F34）
- Xcode: Version 8.0 beta 2 (8S162m)
- Toolchain: Swift Development Snapshot 2016-06-20 (a)
- Vapor: v0.13


# ドキュメント
https://vapor.readme.io/
今回は Vapor v0.13 のドキュメントの手順に従って進めていきます。

# 事前準備

Xcode8.0 beta 2 を事前にインストールし、インストール先を`xcode-select`で選択します。
[Xcode8 beta ダウンロード先](https://developer.apple.com/download/)

インストール後、

```shell-session
sudo xcode-select -s /Applications/Xcode-beta.app/
```

※`/Applications/Xcode-beta.app/`部分は適宜自分のインストール先を指定

# Swift3のインストール

ドキュメントには、Swfit3のインストール方法が、3種類書かれています。

1. macOSへのインストール
- Ubuntuへのインストール
- Swiftenvを使用したインストール

macOSの方は1か3、
Ubuntuの方は2か3
の方法でインストールします。

ここでは、macOSでSwiftenvを使ったインストール方法を記載します。

## Swiftenvからインストール

Swiftのバージョン切り替えツールをインストールします。（RubyのrbenvとかPythonのpyenvみたいなやつ）

### Swiftenvをインストール

```shell-session
# Homebrewからインストール
brew install kylef/formulae/swiftenv

# パスを通す
echo 'if which swiftenv > /dev/null; then eval "$(swiftenv init -)"; fi' >> ~/.bash_profile
source ~/.bash_profile
```

### Swift3のインストール

```shell-session
# インストール
swiftenv install DEVELOPMENT-SNAPSHOT-2016-06-20-a
# インストールしたバージョンをグローバルに設定
swiftenv global DEVELOPMENT-SNAPSHOT-2016-06-20-a
```

### 確認

```shell-session
swift --version

> Apple Swift version 3.0-dev (LLVM c191431197, Clang c6195325c5, Swift add621a959)
```

**3.0-dev** になっていればOK


### インストールされている全てのSwiftのバージョンを確認

```shell-session
swiftenv versions
```

詳しい使い方は[こちら](https://github.com/kylef/swiftenv)をご覧ください。


# Toolboxのインストール

Vaporのコマンドラインツールをインストールします。

### インストール

```shell-session
curl -sL toolbox.qutheory.io | bash
```

### 確認

```shell-session
vapor --help
```

ここで、vaporコマンドが使用できて、以下のようなヘルプ内容が出ればOKです。

```shell-session
Usage: vapor <new|build|run|fetch|clean|test|xcode|version|self|heroku|docker>
Join our Slack if you have questions, need help,
or want to contribute: http://slack.qutheory.io
```

### CLIのアップデート

CLI自身をアップデートするときは次のようにします。

```shell-session
vapor self update
```

# プロジェクトを作成

```shell-session
vapor new Hello
```

このコマンドでプロジェクトファイルをセットアップしてくれます。

セットアップが完了すると、オシャレなVaporのマークが出てきました。

![スクリーンショット 2016-07-12 22.14.57.png](https://qiita-image-store.s3.amazonaws.com/0/11914/fcbcd322-ded9-1874-fed8-f78a1acf65ca.png)


### ディレクトリ構成

とりあえず、プロジェクト直下に移動し、２階層くらいまでのディレクトリ構成を表示してみます。

```shell-session
$ cd Hello/
$ tree -L 2
.
├── App
│   ├── Controllers
│   ├── Middleware
│   ├── Models
│   └── main.swift
├── Config
│   ├── app.json
│   ├── development
│   └── secrets
├── Localization
│   ├── default.json
│   ├── en.json
│   └── es.json
├── Package.swift
├── Procfile
├── Public
│   ├── images
│   └── styles
├── README.md
├── Resources
│   └── Views
└── app.json
```

APPの中にControllersやModels、Resourcesの中にViewsがありますね。
そして、何やら中核になりそうな`main.swift`というファイルがAPPの中にあります。

この`main.swift`に色々書いていきます。

# `main.swift`の編集

デフォルトで色々書いていますが、以下のように書き換えます。

```swift:main.swift
import Vapor
import VaporMustache

let drop = Droplet()

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

drop.serve()

```

`droplet`はVaporのコアクラスです。
Dropletの詳細は[こちら](https://vapor.readme.io/docs/application)

次に、同じくデフォルトでできている以下のファイルを削除します。

- App/Controllers/UserController.swift
- App/Models/User.swift
- App/Middleware/SampleMiddleware.swift

#### ちょっと寄り道

```swift
import Vapor

let drop = Droplet()
```

`Droplet`クラスは、`Vapor`をimportすることで使えるようになります。
蒸気(vapor)を取り込んで雫(droplet)を生み出す。。洒落てますね〜。


# コンパイル

```shell-session
vapor build
```

`vapor build`コマンドは、中で`swift build`を実行しているようです。

# サーバー起動

ビルドが完了したらサーバーを起動させます。

```shell-session
vapor run serve
```

このコマンドでウェブサーバーが立ち上がります。

```shell-session
$ vapor run serve
Running Hello...
No servers.json configuration found.
Starting server at 0.0.0.0:8080

```

また、ポートを指定することもできます。

```shell-session
vapor run serve --port=8080
```

これで、ブラウザから`http://localhost:8080`へアクセスすると、今立ち上げたサーバーにアクセスすることができます。

ただ、ルートパスへは何も出力していないので、真っ白のページになっているかと思います。

先ほど、`main.swift`で処理を記入したのは`hello`というパスだったので、`http://localhost:8080/hello`にアクセスします。

すると、「Hello, world」と画面上に表示されるかと思います。

![スクリーンショット 2016-07-10 18.58.26.png](https://qiita-image-store.s3.amazonaws.com/0/11914/453fe777-ee23-f73e-bd5a-bb77da08dffc.png)


このようにできれば完了です。

以上、始めの第一歩として触ってみました。


# 終わりに

v0.12でやたらとハマると思っていたら、今回はすんなりといけました。 :smile: 
これからが楽しみです。