LoginSignup
6
3

闘魂Elixir ── Phoenixで作ったアプリケーションを1.6.6から1.7.7へアップグレードすることを楽しんだ思い出

Last updated at Posted at 2023-08-16

$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$

$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$

はじめに

Elixirという素敵なプログラミング言語があります。
Elixirには、PhoenixというWebアプリケーションフレームワークがあります。

そのPhoenixを使って2年前に制作したアプリケーションがあります。
2年前の制作当時、Phoenixの最新バージョンは1.6.2でした。
それから幾星霜、月日が経つのは早いもので、Phoenixは1.7.7に上がっています。

Phoenixのバージョンを1.6.2から1.7.7に上げたという語るも涙、聞くも涙の物語をお届けします。(前フリだけは、吾妻鏡なみに大げさに書いています)

前提

ElixirPhoenixのインストールは済ませておいてください。
Gitが使えるとスムーズに進みます。
あとはPostgreSQLくらいです。たとえばDockerで以下のようにやると十分です。

docker run -d --rm -p 5432:5432 -e POSTGRES_USER=postgres -e \
POSTGRES_PASSWORD=postgres postgres

参考プルリク

参考になるかもしれないし、ならないかもしれないプルリクを公開しておきます。


アップグレード

さてそろそろ本題に入ります。
私流のアップグレード方法です。

  1. プロジェクトのルートで、mix phx.new .して同じファイルはとにかく上書きして進める
  2. git diffgit blameを駆使して、手動マージする
  3. mix.lockを消して、mix deps.getする
  4. とにかくmix phx.servermix testで動かしてみて、コンパイルエラーがでるところに対処する

こんな感じでやりました。

1. プロジェクトのルートで、mix phx.new .して同じファイルはとにかく上書きして進める

Phoenixのバージョンがあがって最初に作られるファイルの内容が異なるからです。
あとこれは今回の場合に特有の話ですが、最初に作ったときはデータベースを使う必要がなかったので--no-ectoオプションを付けて、mix phx.newしていました。いまとなっては機能を追加したくその際にデータベースを使うようにしたかったので、初期設定を行ってくれるmix phx.newを実行しました。

以下、愛と感動の物語は続きます。
(筆者は一旦ここで筆をおきました。現実においてもまた改めて続きを書いています)

2. git diffgit blameを駆使して、手動マージする

プロジェクト固有でいろいろあるとおもいます。自分で書き足した必要なものだけを厳選して手動でマージします。
Visual Studio CodeSource Controllボタンを押して表示される画面が便利でした。

3. mix.lockを消して、mix deps.getする

mix.exsには必要なパッケージ(外部ライブラリ)を手動でマージしておきます。
mix deps.getをする前に、念のためmix.lockを消してあたかもまっさらなところからはじめてmix deps.getすることを現出させました。

4. とにかくmix phx.servermix testで動かしてみて、コンパイルエラーがでるところに対処する

いろいろありましたが、代表的なところを言うとlib/<app_name>_web/viewsディレクトリとtest/<app_name>_web/viewsディレクトリの削除です。
もともと1.6.2時代のプロジェクトで最初につくられたままの状態で触っていませんでした(git blameが便利です!)し、1.7.7でmix phx.newしたときにはできないフォルダなので迷わず消して問題ないです。


その他に得られた知見

その他に得られた知見を書いておきます。

JSONのレンダリング

APIの応答でJSONを返すことにするときの実装です。
1.7.7の公式ドキュメントはこのへんです。

@piacerex さんからコメントをもらいました!
ありがとうーーーーッ!!! ございます。

:point_up::point_up::point_up: @piacerex さんからのコメントもあわせてご確認ください。 :point_up::point_up::point_up:

1.6.2

1.6.2時代は以下のように書いていました。

lib/slack_doorman_web/controllers/event_controller.ex
defmodule SlackDoormanWeb.EventController do
  use SlackDoormanWeb, :controller

  def create(conn, params) do
    ...
    render(conn, "challenge.json", challenge: challenge)
  end
lib/slack_doorman_web/views/event_view.ex
defmodule SlackDoormanWeb.EventView do
  use SlackDoormanWeb, :view

  def render("challenge.json", %{challenge: challenge}) do
    %{challenge: challenge}
  end
end

lib/slack_doorman_web/views/event_view.exは先程申しました通り、1.7.7では作られないフォルダですので、1.7.7のプロジェクトにはありません。

1.7.7

1.7.7では以下のように変わります。

lib/slack_doorman_web/controllers/event_controller.ex
defmodule SlackDoormanWeb.EventController do
  use SlackDoormanWeb, :controller

  def create(conn, params) do
    ...
    render(conn, :create, challenge: challenge)
  end
lib/slack_doorman_web/controllers/event_json.ex
defmodule SlackDoormanWeb.EventJSON do
  def create(%{challenge: challenge}) do
    %{challenge: challenge}
  end
end

EventControllerモジュールに対応するようにEventJSONモジュールという名前のモジュールをPhoenixは期待しています。

assets/vendor 配下に多くのファイル(.svg)が追加されています

記事を書くにあたりプルリクを見直していると、変更ファイル数が900を超えていることに気づきました。
なぜそんなに多いのだとよくみると、assets/vendor配下に多くのファイル(.svg)が追加されていました。
1.7.7はアイコンが最初から多く追加されます。

mix phx.release.gen --docker

別の記事を作りました。ご参照くださいませ。


さいごに

Phoenixで作ったアプリケーションを1.6.6から1.7.7へアップグレードすることを楽しみました。
プロジェクトのルートでmix phx.new .して、あとはGitを駆使してがんばりますということを書いています。
app:updateとかありませんので、もしあなたが提供してくださったらヒーローです。
I need a heroです!

この記事がどなたかのお役に立てますことを切に願っております。


闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。


$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$

6
3
2

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
3