Vapor4の正式版が出たのでVapor3アプリケーションを移行してみる

Swift
Vapor4の正式版が出たのでVapor3アプリケーションを移行してみる

はじめに

いつの間にかVapor4が正式にリリースされていましたね。うっかりしてました。

新しいものはひとまず試してみましょう。いままでずっとVapor3でやって来ましたが、これをVapor4に対応させてみます。

パッケージをバージョンアップする

Package.swiftを書き換える

パッケージのバージョンを変えていきます。fluent系のパッケージがドライバ部分と基本部分に分離しているようなので注意が必要です。

Vapor4
  .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の文法が一部変わっているようなので、対応させます。

Vapor3
.target(name: "App", dependencies: [Vapor", "MongoSwift", "Leaf"]),
Vapor4
.target(name: "App", dependencies: [
  .product(name: "Vapor", package: "vapor"),
  .product(name: "MongoSwift", package: "mongo-swift-driver"),
  .product(name: "Leaf", package: "leaf")
]),

書く量がちょっと増えました。nameはプロジェクト内で参照するためのもの、packageは参照するパッケージ名ですね。

それと、プラットフォームの指定も必要になりました。プロジェクト名の記述の後あたりに突っ込んでおくと良いと思います。

Vapor4
platforms: [
  .macOS(.v10_15)
],

バージョンアップする

PAckage.swiftの書き換えができたら、パッケージのバージョンアップをします。

swift package update

しばし待ちます。ここは待てば済むので特に問題はないかと思います。

XCodeのプロジェクトファイルを作り直す

これを忘れてしまって、ビルドができなかった。

先ほどのパッケージのバージョンアップは、文字通りパッケージのバージョンアップを行うだけのようです。XCodeのプロジェクトファイルで使うパッケージ群を使いたいバージョンに更新(切り替え)する必要があります。

ですので、XCodeのプロジェクトファイルを再生成してあげます。

swift package generate-xcodeproj

XCodeを終了してから、上記コマンドを実行します。generateとありますが、既存のプロジェクトファイルがある場合は新しいものに置き換えられるようです。

フレームワークに関連するファイルを書き換えていく

この辺りは公式サイトを参考にしました。Vapor3の時にあったファイルが別ファイルに統一されたりしているので、ちょっと混乱する部分もありますが、ここは素直に受け入れてみます。

Vapor: Version (4.0) → Upgrading
Vapors documentation (web framework for Swift).

main.swiftを書き換える

公式サイトのモノマネをします。ガラッと変わりましたね。
なお、MongoDBを使っているので、その分も追加しています。

Vapor4
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の部分については、このような感じに書き換えてみました。

Vapor4
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についても書き換えしました。

Vapor4
app.views.use(.leaf)
app.leaf.cache.isEnabled = app.environment.isRelease

データモデルを書き換える

書き換えるといっても、そんなに大したことではありません。MongoSwiftのバージョンアップに伴い、ObjectId型がちょっと変わりました。

Vapor3
ObjectId
Vapor4
BSONObjectID

まとめ

Vaporフレームワークのベース部分についてVapor4対応ができました。いざVaporアプリケーションを動かしてみようと思うのですが、その前にroutes.swiftをなんとかしないといけません。XCodeでみるとエラーがたくさん出ています。このままではビルドが通りません。

エラーの多さにウンザリしそうですが、プログラミングというものは地道に進めていくことが肝心なのです。プチプチを端から順番に一つずつ潰すが如く、エラーに一つずつ対応していきたいと思います。