はじめに
いつの間にかVapor4が正式にリリースされていましたね。うっかりしてました。
新しいものはひとまず試してみましょう。いままでずっとVapor3でやって来ましたが、これをVapor4に対応させてみます。
パッケージをバージョンアップする
Package.swiftを書き換える
パッケージのバージョンを変えていきます。fluent系のパッケージがドライバ部分と基本部分に分離しているようなので注意が必要です。
.package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
.package(url: "https://github.com/vapor/fluent.git", from: "4.0.0-rc"),
//fluent-sqliteから名称変更
.package(url: "https://github.com/vapor/fluent-sqlite-driver.git", from: "4.0.0"),
.package(url: "https://github.com/vapor/leaf.git", from: "4.0.0-rc"),
.package(url: "https://github.com/mongodb/mongo-swift-driver.git", from: "1.0.0")
グイグイと上げていきます。どさくさに紛れて、一部RC版にしています。正式版が良いという方は各リポジトリを見て最新の正式リリース版に切り替えてみてください。
ただし、正式リリース版がまだVapor4に対応していない可能性もあるので、動かしてみてエラーが出たらRC版も検討してみてください。私めは上記の通りRC版でしか試していないので、正式リリース版で動くかどうかは試していません。
ちなみに、SQLiteは使っていないのですが、fluent絡みが変わっていたので参考までに加えてみました。
文法的なものが変わっているので対応させる
Package.swiftの文法が一部変わっているようなので、対応させます。
.target(name: "App", dependencies: [Vapor", "MongoSwift", "Leaf"]),
.target(name: "App", dependencies: [
.product(name: "Vapor", package: "vapor"),
.product(name: "MongoSwift", package: "mongo-swift-driver"),
.product(name: "Leaf", package: "leaf")
]),
書く量がちょっと増えました。nameはプロジェクト内で参照するためのもの、packageは参照するパッケージ名ですね。
それと、プラットフォームの指定も必要になりました。プロジェクト名の記述の後あたりに突っ込んでおくと良いと思います。
platforms: [
.macOS(.v10_15)
],
バージョンアップする
PAckage.swiftの書き換えができたら、パッケージのバージョンアップをします。
swift package update
しばし待ちます。ここは待てば済むので特に問題はないかと思います。
XCodeのプロジェクトファイルを作り直す
これを忘れてしまって、ビルドができなかった。
先ほどのパッケージのバージョンアップは、文字通りパッケージのバージョンアップを行うだけのようです。XCodeのプロジェクトファイルで使うパッケージ群を使いたいバージョンに更新(切り替え)する必要があります。
ですので、XCodeのプロジェクトファイルを再生成してあげます。
swift package generate-xcodeproj
XCodeを終了してから、上記コマンドを実行します。generateとありますが、既存のプロジェクトファイルがある場合は新しいものに置き換えられるようです。
フレームワークに関連するファイルを書き換えていく
この辺りは公式サイトを参考にしました。Vapor3の時にあったファイルが別ファイルに統一されたりしているので、ちょっと混乱する部分もありますが、ここは素直に受け入れてみます。
main.swiftを書き換える
公式サイトのモノマネをします。ガラッと変わりましたね。
なお、MongoDBを使っているので、その分も追加しています。
import App
import MongoSwift
import Vapor
var env = try Environment.detect()
try LoggingSystem.bootstrap(from: &env)
let app = Application(env)
defer {
try? app.mongoClient.syncClose()
cleanupMongoSwift()
app.shutdown()
}
try configure(app)
try app.run()
公式サイトによるとapp.swiftに記載されていたものがこのmain.swiftに吸収されているので、消しても大丈夫なようです。
configure.swiftを書き換える
これも公式サイトのモノマネになります。
MongoDBの部分については、このような感じに書き換えてみました。
let client = try MongoClient([MongoDBパス], using: app.eventLoopGroup, options: nil)
let db = client.db("vaporapp")
do {
_ = try db.createCollection("books")
} catch {
_ = db.collection("books")
}
app.mongoClient = client
Leafについても書き換えしました。
app.views.use(.leaf)
app.leaf.cache.isEnabled = app.environment.isRelease
データモデルを書き換える
書き換えるといっても、そんなに大したことではありません。MongoSwiftのバージョンアップに伴い、ObjectId型がちょっと変わりました。
ObjectId
BSONObjectID
まとめ
Vaporフレームワークのベース部分についてVapor4対応ができました。いざVaporアプリケーションを動かしてみようと思うのですが、その前にroutes.swiftをなんとかしないといけません。XCodeでみるとエラーがたくさん出ています。このままではビルドが通りません。
エラーの多さにウンザリしそうですが、プログラミングというものは地道に進めていくことが肝心なのです。プチプチを端から順番に一つずつ潰すが如く、エラーに一つずつ対応していきたいと思います。