しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Vaporを使ってSwiftサーバーを立ててみる

こちらの記事を参考にSwiftサーバーを作ってみました。

qiita.com

準備

Swift Package Managerを使えるようにします。
こちらのページのLatest Development Snapshotsをインストール後、/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin/へのパスを通せば使えるようになります。

swift.org

次にXcodeで新規プロジェクトを作成します。
プロジェクトはCommand Line Toolを選択して下さい。

f:id:llcc:20160221235022p:plain

次にPackage.swiftというファイルを追加して以下のようにインストールしたいパッケージ情報を書きます。

import PackageDescription

let package = Package(
    name: "MyWebApp",
    dependencies: [
        .Package(url: "https://github.com/tannernelson/vapor.git", majorVersion: 0)
    ]
)

次にmain.swiftをSourcesフォルダに移動した上で以下のように修正します。

import Foundation
import Vapor

Route.get("hello") { _ in
    return ["Hello" : "World"]
} 

let server = Server()
server.run(port: 8080)

フォルダ構成は以下のようになります。

f:id:llcc:20160221235248p:plain

ビルド & 起動

次にPackage.swiftの配置されたフォルダでswift buildコマンドを実行します。
これで.build/debug/ServerSwiftTestという名前で実行ファイルが生成されるので動かしてみます。

f:id:llcc:20160221235432p:plain

ブラウザでlocalhost:8080/helloにアクセスするとJSONが返ってくるのが分かります。

f:id:llcc:20160221235440p:plain

テンプレートエンジン

VaporではStencilというテンプレートエンジンを使う事ができます。
使うためにはPackage.swiftにStencilを追加します。

import PackageDescription

let package = Package(
    name: "MyWebApp",
    dependencies: [
        .Package(url: "https://github.com/tannernelson/vapor.git", majorVersion: 0),
        .Package(url: "https://github.com/tannernelson/vapor-stencil.git", majorVersion: 0) // 追加
    ]
)

Package.swiftのあるフォルダにResourcesフォルダを作ってindex. stencilを作成します。

<html>
    <h1>{{ message }}</h1>
</html>

次にmain.swiftを少し修正します。

import Foundation
import Vapor
import VaporStencil

View.renderers[".stencil"] = StencilRenderer() // 追加

Route.get("/") { request in
    return try! View(path: "index.stencil", context: ["message": "Hello"]) // 修正
}

let server = Server()
server.run(port: 8080)

ビルドしなおしてアクセスすると以下のような表示になります。

f:id:llcc:20160222000606p:plain