はじめに
一年前くらいにラズパイで Vapor を動かすのにチャレンジ(ラズパイにVaporいれたけど失敗した話)していたのですがそのときは動かず。。。今年再チャレンジしたらついに動きました
方法としては Mac でプロジェクト作成をしてラズパイに転送するやり方です。
下記記事に大変お世話になりました
https://qiita.com/YutoMizutani/items/ed66461a6150d28b886f
環境
Mac
- macOS Big Sur バージョン 11.6
- Xcode 13.1
- Vapor Toolbox 18.3.3
ラズパイ
- Raspberry Pi 3 Model B
- Raspbian 10
- Swift 5.1.5
調べ方よくわかってないですが下記コマンドで確認しました。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 10 (buster)
Release: 10
Codename: buster
$ swift --version
Swift version 5.1.5 (swift-5.1.5-RELEASE)
Target: armv6-unknown-linux-gnueabihf
Mac側の操作
Mac 側色々やってたのでちょっと何入れたか覚えてないです。。。たぶん下記コマンドはやったはず。
$ brew tap vapor/tap
$ brew install vapor/tap/vapor
$ brew install libressl
色々入れたら Vapor プロジェクトを作成します。
-
プロジェクト作成(いろいろ聞かれるやつは全部 n にしました)
$ vapor new hoge
-
Xcode で開く
$ cd hoge $ vapor xcode
-
Package.swift などを修正
// swift-tools-version:5.1 // ここ変更
import PackageDescription
let package = Package(
name: "hoge",
platforms: [
.macOS(.v10_15)
],
dependencies: [
.package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"), // ここ変更
],
targets: [
.target(
name: "App",
dependencies: [
.product(name: "Vapor", package: "vapor")
],
swiftSettings: [
.unsafeFlags(["-cross-module-optimization"], .when(configuration: .release))
]
),
.target(name: "Run", dependencies: [.target(name: "App")]) // ここ変更
]
)
import App
import Vapor
var config = Config.default()
var env = try Environment.detect()
var services = Services.default()
try configure(&config, &env, &services)
let app = try Application(config: config, environment: env, services: services)
try app.run()
import Vapor
public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
let router = EngineRouter.default()
try routes(router)
services.register(router, as: Router.self)
}
import Vapor
func routes(_ router: Router) throws {
router.get { req in
return "It works!"
}
router.get("hello") { req -> String in
return "Hello, world!"
}
}
これでとりあえず動くか実行してみます(Xcode で Run する)。
実行すると下記のように表示され、ブラウザで下記 URL にアクセスすると「It works!」の表示が確認できます
Server starting on http://localhost:8080
無事起動を確認できたので停止して Xcode を閉じます。
ラズパイへ転送する前に不要そうな下記ファイルを削除しておきます。
- .dockerignore
- .git
- .gitignore
- docker-compose.yml
- Dockerfile
- Tests
- .swiftpm/xcode/xcuserdata
こんな状態です。
下記コマンドでラズパイに転送します。Mac 側はこれで終了!
$ scp -r hoge pi@raspberrypi.local:
ラズパイ側
ラズパイの OS インストールとかは下記参考。
MacでラズパイのLチカしてみた
下記のように設定しておいてやるとディスプレイなしでいけました
$ cd /Volumes/boot
$ vi wpa_supplicant.conf
下記を記載して wq で終了。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
ssid="SSID記載F"
psk="パスワード記載"
key_mgmt=WPA-PSK
}
ラズパイを起動したらあとは必要そうなものを入れて Mac から転送したやつを実行すれば OK です。
// いろいろ更新
$ sudo apt-get update
$ sudo apt-get upgrade
// Swift インストール
$ curl -s https://packagecloud.io/install/repositories/swift-arm/release/script.deb.sh | sudo bash
$ sudo apt-get install swift5
// Vapor に必要なやつインストール
$ sudo apt-get install libssl-dev
// Mac から転送したやつ実行
$ cd hoge
$ swift run Run
無事起動できました
おわりに
ほんとはラズパイだけでやりたかったんですが Ubuntu とか Docker とかがどうしてもよくわからず。。。まあラズパイで Vapor を動かすことができたのでよかったです
あとは Mac のブラウザからアクセスできるよう模索したいと思います(http://pi@raspberrypi.local:8080 とかでアクセスできると思ったんですが無理でした)。