この記事は Elixir Advent Calendar 2025 シリーズ1の12日目です。昨日は @mnishiguchi さんでした!
ここ数年ほど imagepix というサービスを開発・運営しています。imagepixは、URLに横幅や縦幅、フォーマット等を指定すると、自分が管理しているS3バケットに置いてある画像を動的に変換して返してくれるサービスです。
imagepixの画像変換エンジンは別の技術で開発していますが、管理コンソールはPhoenix製です。開発当初からPhoenix 1.7を使っていましたが、2025年8月にPhoenix 1.8がリリースされたのでアップデートすることにしました。
なお、今回のアップデートによる不具合は特に発生していません ![]()
ライブラリのアップデート
Phoenixを1.8にアップデートしますが、元々使っていたLiveView 1.0はPhoenix 1.8に対応していないため、LiveViewも1.1にアップデートしました。
Phoenix 1.8で生成されるコードの取り込み
Phoenix 1.8のプロジェクトを別ディレクトリに作成し、必要な変更を比較しながら取り込みました。
mix archive.install hex phx_new 1.8.0
mix phx.new imagepix
プロジェクト作成時点からほぼ更新されないファイル
以下のファイルはあまり更新する機会がなく、大きな差分はありませんでした。
lib/imagepix.exlib/imagepix/application.exlib/imagepix/mailer.exlib/imagepix/repo.exlib/imagepix_web/endpoint.exlib/imagepix_web/telemetry.ex
ただし、lib/imagepix_web.ex だけは変更の量が多かったため、static_paths を除いて新しい内容に置き換えました。
mix.exs
細かい変更がいくつかあるため、deps/0 以外の箇所を新しい内容に合わせて更新しました。
設定ファイル
細かい変更がいくつかあるため、config/ 以下を新しい内容に合わせて更新しました。
着目すべき点として、Tailwindのバージョンが4系に上がり、新しい機能が使えるようになりました。
認証周り
imagepixではGitHubログインのみ認証手段を提供していますが、コードは mix phx.gen.auth で生成されるコードに寄せています。
Phoenix 1.8のプロジェクトで以下のコマンドを実行し、生成されたファイルの内容に合わせて更新しました。
mix phx.gen.auth Accounts Account accounts
また、lib/imagepix_web/account_auth.ex の変更に合わせて lib/imagepix_web/router.ex も更新しました。
コンテキスト
Phoenix 1.8から Scopes という概念が導入されました。
mix phx.gen.live 等で生成されるコンテキストでは、第1引数として scope を受け取る関数が定義されるようになったため、それに合わせて既存のコードを更新しました。
assets
Phoenix 1.8ではデフォルトでdaisyUIが導入されます。素のTailwindからdaisyUIに移行しておいたほうが今後のUI作成が楽になると考え、assets/ 以下を新しい内容に合わせて更新しました。
また、LiveView 1.1で Colocated Hooks が追加されました。
imagepixでは折れ線グラフを表示するために独自のHooksを定義しているので、Colocated Hooksと共存できるように assets/js/app.js を更新しました。
import {hooks as colocatedHooks} from "phoenix-colocated/imagepix"
import * as hooks from "./hooks"
...
const liveSocket = new LiveSocket("/live", Socket, {
longPollFallbackMs: 2500,
params: {_csrf_token: csrfToken},
hooks: {...colocatedHooks, ...hooks}, # Colocated Hooksと独自Hooksの両方を指定する
})
core_components.ex
Phoenix 1.8では、lib/imagepix_web/components/core_components.ex の内容がdaisyUIを前提としたものになっています。詳しい変更点は以下の記事を参照してください。
一部独自のコンポーネントはありますが、新しい内容に合わせてdaisyUIを使うように更新しました。
また、新しい core_components.ex にはモーダルが含まれていませんが、imagepixでは一部の画面で使用しているため自前で実装しました。
LiveView
Phoenix 1.8では、LiveViewの自動生成コードでHEExテンプレートが別ファイルではなく render/1 関数で記述するスタイルに変わったため、それに合わせて既存のコードを更新しました。
また、従来の put_layout を使ったレイアウト指定ではなく、レイアウトコンポーネントを利用する方式が推奨されるようになったため、こちらも依存のコードを更新しました。
最後に
私が普段よく使っているRuby on Railsでは、アプリケーションのコードは変わらないのにフレームワーク内部の挙動が変わるということが結構あり、調査検証にそれなりの手間がかかります。Phoenixは基本的にコードを生成してくれるので隠れた挙動が少なく、コードの変更量は多くてもアップデートの負担はそこまで大きくはないかなーという印象です。
Phoenixに限らずアップデートの恩恵を受けられるよう、今後も追従していきます ![]()
明日の Elixir Advent Calendar 2025 シリーズ1の13日目は @nanbut14 さんです!
お楽しみに ![]()