6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Elixir] 稼働中のサービスで使っているPhoenixを1.7から1.8にアップデートした記録

Last updated at Posted at 2025-12-11

この記事は Elixir Advent Calendar 2025 シリーズ1の12日目です。昨日は @mnishiguchi さんでした!


ここ数年ほど imagepix というサービスを開発・運営しています。imagepixは、URLに横幅や縦幅、フォーマット等を指定すると、自分が管理しているS3バケットに置いてある画像を動的に変換して返してくれるサービスです。

imagepixの画像変換エンジンは別の技術で開発していますが、管理コンソールはPhoenix製です。開発当初からPhoenix 1.7を使っていましたが、2025年8月にPhoenix 1.8がリリースされたのでアップデートすることにしました。

なお、今回のアップデートによる不具合は特に発生していません :clap:

ライブラリのアップデート

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.ex
  • lib/imagepix/application.ex
  • lib/imagepix/mailer.ex
  • lib/imagepix/repo.ex
  • lib/imagepix_web/endpoint.ex
  • lib/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 を更新しました。

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に限らずアップデートの恩恵を受けられるよう、今後も追従していきます :muscle:


明日の Elixir Advent Calendar 2025 シリーズ1の13日目は @nanbut14 さんです!
お楽しみに :rocket:

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?