$\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に上げたという語るも涙、聞くも涙の物語をお届けします。(前フリだけは、吾妻鏡なみに大げさに書いています)
前提
Elixir、Phoenixのインストールは済ませておいてください。
Gitが使えるとスムーズに進みます。
あとはPostgreSQLくらいです。たとえばDockerで以下のようにやると十分です。
docker run -d --rm -p 5432:5432 -e POSTGRES_USER=postgres -e \
POSTGRES_PASSWORD=postgres postgres
参考プルリク
参考になるかもしれないし、ならないかもしれないプルリクを公開しておきます。
アップグレード
さてそろそろ本題に入ります。
私流のアップグレード方法です。
- プロジェクトのルートで、
mix phx.new .
して同じファイルはとにかく上書きして進める -
git diff
やgit blame
を駆使して、手動マージする -
mix.lock
を消して、mix deps.get
する - とにかく
mix phx.server
やmix test
で動かしてみて、コンパイルエラーがでるところに対処する
こんな感じでやりました。
1. プロジェクトのルートで、mix phx.new .
して同じファイルはとにかく上書きして進める
Phoenixのバージョンがあがって最初に作られるファイルの内容が異なるからです。
あとこれは今回の場合に特有の話ですが、最初に作ったときはデータベースを使う必要がなかったので--no-ecto
オプションを付けて、mix phx.new
していました。いまとなっては機能を追加したくその際にデータベースを使うようにしたかったので、初期設定を行ってくれるmix phx.new
を実行しました。
以下、愛と感動の物語は続きます。
(筆者は一旦ここで筆をおきました。現実においてもまた改めて続きを書いています)
2. git diff
やgit blame
を駆使して、手動マージする
プロジェクト固有でいろいろあるとおもいます。自分で書き足した必要なものだけを厳選して手動でマージします。
Visual Studio CodeのSource Controllボタンを押して表示される画面が便利でした。
3. mix.lock
を消して、mix deps.get
する
mix.exs
には必要なパッケージ(外部ライブラリ)を手動でマージしておきます。
mix deps.get
をする前に、念のためmix.lock
を消してあたかもまっさらなところからはじめてmix deps.get
することを現出させました。
4. とにかくmix phx.server
やmix 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 さんからコメントをもらいました!
ありがとうーーーーッ!!! ございます。
@piacerex さんからのコメントもあわせてご確認ください。
1.6.2
1.6.2時代は以下のように書いていました。
defmodule SlackDoormanWeb.EventController do
use SlackDoormanWeb, :controller
def create(conn, params) do
...
render(conn, "challenge.json", challenge: challenge)
end
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では以下のように変わります。
defmodule SlackDoormanWeb.EventController do
use SlackDoormanWeb, :controller
def create(conn, params) do
...
render(conn, :create, challenge: challenge)
end
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 ぁっダァー!}$