Kristopher Baker iOSを土台に · プロダクトシステム · AI支援ワークフロー
← Inkwell

shipped · 2026.07.14 · 約2分

InkwellがLinux上でもビルドできるようになった

Inkwellはこれまでずっと、Homebrew経由でインストールしたmacOSの上でしか動かしたことがなかった。好奇心もあって、Debian 12(aarch64)にSwift 6ツールチェーンを入れ、ソースから直接ビルドしてみた。壊れた箇所は三つあり、どれも机上の空論ではなく実際に踏んだ問題だった。CryptoKitはApple専用のフレームワークなので、それを使っていた一箇所だけをswift-cryptoの互換APIであるCryptoモジュールに切り替え、#if canImport(CryptoKit) で条件分岐した。GlibcのstderrはDarwinのものと違って該当のアノテーションが付いておらず、Swift 6の厳格な並行性チェックが fputs(_, stderr) の呼び出しをすべて弾いてしまうので、FileHandle.standardError.write に置き換えた。厄介だったのはリソースバンドルの方だ。SwiftPMが生成するバンドルディレクトリの名前は、Appleのプラットフォームでは .bundle だが、Linuxでは <パッケージ名>_<ターゲット名>.resources になる。ビルド自体はどちらでも成功するのに、Linux側だけテーマの読み込みが実行時に静かに失敗し、ビルドは通っているのにスタイルの当たっていないサイトができ、ビルドログを見てもその理由は分からなかった。

修正の確認は正攻法でやった。swift build を通したあと、まっさらな状態から inkwell initinkwell build を実行し、HTML、フィード、サイトマップ、アセットが全部きちんと出ているか確かめた。CIは今もmacOS限定なので、これはグリーンのチェックマークが保証してくれるものではなく、自分の手でひとつずつ確認したに過ぎない。それが気になったので、次にやったのはLinux用のビルド・テストジョブをCIに追加することだった。次に似たような移植性の問題が起きたときは、誰かのDebian環境で静かに壊れるのではなく、プルリクエストの時点で派手に落ちてくれるはずだ。