Swift製Webフレームワーク Vaporの紹介2019


# Vaporとは

Vaporは、Swift製のWebフレームワークです。
公式URLは [https://vapor.codes/](https://vapor.codes/) で、Vapor 本体のリポジトリ([https://github.com/vapor/vapor](https://github.com/vapor/vapor)) には　

> Vapor is a web framework for Swift. 
> It provides a beautifully expressive and easy to use foundation for your next website, API, or cloud project.　

と説明が書かれています。
Swift製のWebフレームワークは [Perfect](https://perfect.org/) 、[Kitura](https://www.kitura.io/)などがありますが、その中でも Vapor はスター数も多く(2019年12月現在1万7千程度)、開発も活発でこれからが楽しみなフレームワーク&コミュニティです。
今回はVaporアドベントカレンダー2019の初日として、インストールとHelloWorldをしてみようと思います。

参考: [SwiftでWeb開発ができるフレームワーク集](https://qiita.com/tomy0610/items/8a94a963c7b260a4ad2a)


# 環境構築

## for MacOS
公式(https://docs.vapor.codes/3.0/install/macos/)

Xcode(9.3 以上)が必要なのでApp Storeからダウンロードします。(https://itunes.apple.com/us/app/xcode/id497799835?mt=12)
また Vapor3 には Swift 4.1 以上が必要なので、バージョンを確認します。

``` bash
$ swift --version
```

```
Apple Swift version 5.1.2 (swiftlang-1100.0.278 clang-1100.0.33.9)
Target: x86_64-apple-darwin19.0.0
```

次に Vapor のプロジェクト作成が簡単にできる VaporToolBoxを インストールします。

``` bash
$ brew install vapor/tap/vapor
$ brew upgrade vapor  # すでにインストールされている場合
```

Vapor ToolBoxがインストールできたことを確認します。

``` bash
$ vapor --help
```

## for Ubuntu
公式(https://docs.vapor.codes/3.0/install/ubuntu/)
Vaporは以下のバージョンのUbuntuでサポートされています。

| Version | Codename         |
|---      |---               |
|18.10    |Cosmic Cuttlefish |
|18.04	  |Bionic Beaver     |
|16.10    |Yakkety Yak       |
|16.04	  |Xenial Xerus      |
|14.04	  |Trusty Tahr       |

以下のスクリプトでVaporのリポジトリをAPTで参照できるようにします。
このスクリプトはサポートされていないバージョン以外で動かすとエラーが出てしまいます。

``` bash
eval "$(curl -sL https://apt.vapor.sh)"
```

リポジトリの参照をマニュアルでやりたい方はこちらのコマンドを実行してください。

``` bash
wget -q https://repo.vapor.codes/apt/keyring.gpg -O- | sudo apt-key add -
echo "deb https://repo.vapor.codes/apt $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/vapor.list
sudo apt-get update
```

APTを使ってswiftとvaporをインストールします。

``` bash
$ sudo apt-get install swift vapor
```

インストールされたことを確認します。

``` bash
$ swift --version
$ vapor --help
```

# HelloWorld

環境構築が完了したので早速プロジェクトを作成します。
プロジェクトの作成には `new` コマンドを使用します。

``` bash
$ vapor new リポジトリ名
```

また、RailsのAPIモードのようにフラグをつけることでテンプレートを選ぶことができます。
今回は　`Web`　テンプレートを使用してプロジェクトを作成します。
フラグを付けずにプロジェクトを作成するとAPIテンプレートで作成されます。

| Name | Flag                    | Description                             |
|---   |---                      |---                                      |
|API   |--template=api           | Fluentデータベースを使ったJSON API          |
|Web   |--template=web           | Leafテンプレートを使ったを含むHTMLウェブサイト |
|Auth  |--template=auth-template | Fluent DBとAuthを使ったJSON API           |

今回は`sommelier`プロジェクトをWebテンプレートで作成します。
今年のアドベントカレンダーでは、Vapor でIT企業の技術ブログのまとめサイトを作ってみようと思います。

``` bash
$ vapor new sommelier --template=web
```

プロジェクト名のディレクトリが作成されれます。
ディレクトリの中に入り、 `build` コマンドでビルドします。

``` bash
$ cd sommelier
$ vapor build
```

ビルドが完了したら `run`　コマンドでアプリを実行します。

``` bash
$ vapor run
```

ブラウザで　http://localhost:8080/ にアクセスするとアプリケーションが起動していることが確認できます。

![vapor.png](https://qiita-image-store.s3.amazonaws.com/0/63855/e6c30063-4f6c-63ae-2596-0ea05c14401e.png)


### 注意

Xcode をアップデートをアップデートした後などはに以下のエラーが出ることあります。
Xcode コマンドラインツールを指定することで解決します。

```
Error: backgroundExecute(code: 1, error: “warning: ‘fetch’ command is deprecated; use ‘resolve’ instead\nerror: terminated(72): xcrun --sdk macosx --find xctest output:\n \n\n”, output: “”)
```

```
$ sudo xcode-select -switch /Applications/Xcode.app/
$ xcode-select -p
$ vapor build
```

参考: [Error building vapor after AppStore Updates](https://forums.raywenderlich.com/t/error-building-vapor-after-appstore-updates/43498)

# おまけ

Vaporのユニークな機能として、Xcodeを使うことができます。
`xcode`コマンドで `.xcodeproj` ファイルが作成されます。

``` bash
$ vapor xcode
```

作成された`.xcodeproj` を開き、iOSのように三角ボタンで実行することができます。