はじめに
Vapor3のプロジェクトをVapor4に対応させるべく、パッケージのアップデートやフレームワーク周りの書き換えをしてみました。
この時点でroutes.swiftはエラーの嵐です。公式サイトにもある通りメソッドがかなり変わっています。これを一つずつ潰していきます。プログラミングには粘り強さが不可欠です。
GETメソッドの書き換えをしてみる
文字列を返すだけのもの
app.get { req in
return "It works!"
}
GETメソッドで単純に文字列を返してもらうものについては、書き換えは非常に単純です。
もともとrouter.get
となっていたものをapp.get
とするだけです。
単純。これなら他のメソッドも簡単ですね。と言いたいところですが、そうは簡単に行かないのがいつものことなので、浮かれずに進めていきましょう。
Leafテンプレートのレンダリングをするもの
Leafテンプレートのレンダリングをするものはちょっと複雑です。複雑というよりも、Leafテンプレートの名称を把握さえ出来ていれば大丈夫です。
app.get("new") { req in
return try req.view().render("AddBook")
}
app.get("new") { req in
req.view.render("AddBook")
}
テンプレートが無いと言われた!
書き換え自体は単純です。ですが、テンプレートの保存先に注意が必要です。Leafテンプレートの名称だけ把握できていれば楽勝と思っていたのですが、そうは問屋が卸さない。
そのままビルドしてテンプレートのレンダリングをしようとすると、テンプレートファイルが見つからない旨のエラーが出ます。
LeafKit.LeafError.Reason.noTemplateExists([テンプレートファイル名])
ちゃんとプロジェクトディレクトリにあるし、XCodeのファイルツリーにも表示されているのになんで?となってしまいますが、これはビルドされたディレクトリ内にテンプレートファイルが無いことによるものです。
Leafテンプレートをどこに置いておけばよいか?
app.leaf.configuration.rootDirectory
で示されたディレクトリに置いてください。
私の場合は上記ディレクトリに対してプロジェクトディレクトリ内のテンプレートを置いた場所のシンボリックリンクをはっておきました。
表示できました。見た目が変わってないようですが、ちゃんとVapor4に対応させて表示させたものですよ。

そういえば、Vapor3のときはLeafテンプレートが自動的に配置されていたんでしょうかね?Vapor4に移行するとなった以上、今はVapor3の深掘りをしないでおきましょう。
まとめ
どんなプロジェクトでもそうだと思いますが、バージョンアップに伴う修正と書き換えは骨が折れます。既存のものと動きが変わらないようにしないといけないですからね。
だからこそ、テストは大切です。面倒になって書いてないと、こういう時に苦労します。