プログラミングでお金をもらうようになったちゅんです。
Djangoでいろいろしてるのですが、つい先日(12月3日くらい?)にDjango3.0とかいうのが出たんですよ。
「ふーーーん まぁ今やってるプロジェクト終わったら個人的に触ってみるか」程度でスルーしてたら自分の開発にも影響があって焦りまくったお話です。
本題
環境
- Docker-Compose
- pipenv
何があったか
Docker触ったことなかったので「Dockerなにそれわからん~」って言いながらDockerfileを書くのを人に任せていたんですね。(これ重要)
プロジェクト開始時時点での最新バージョンDjango 2.2.7を使っていたのですが、インストール時にバージョン指定せずにインストールしていたんですね。
pipenv install django
って実行するとPipfileにdjango = "*"
って記入されるんですが、これって最新のバージョンを取ってくる意味でして…
何も考えずにDockerで動かしてみたらエラーを吐いてしまって「は?」ってなるんですけどver2.2.7のコードはver3.0で動くわけもないんですね。
これはバージョンがいかんのかと思って2.2.7をインストールするように指定し直さなあかんなって思って
pipenv uninstall django pipenv install django==2.2.7
ってインストール時指定してあげればDockerくんも2.2.7をインストールしてくれるだろうな~と思ってたらいつまで経っても3.0をインストールしてて仕事中にPC破壊しかけました。
pipenv install
と打つとカレントディレクトリにあるPipfile・Pipfile.lockを探して自動でインストールしてくれます。(前提知識)
pipenv install
コマンド打つとPipfileに書いてある物を自動的にインスコしてくれると思っていたんです。(ここも重要)
なんで変更が適用されないんだろうか原因究明を急ぎました。
原因
ふと人に書いてもらったDockerfileを見ると
RUN pipenv install --skip-lock --system --dev
って書いてあって、
- --skip-lock : Pipfile.lockを使わずにインストール
- --system : 仮想環境ではなくデフォルトのPythonにインストール
- --dev : dev-packageもインストール
の--skip-lock
オプションが原因でした。
Pipfile.lockがバージョン周りの情報を扱うらしいです。
解決
Dockerfileを
RUN pipenv install --system --ignore-pipfile --deploy
に書き換えてちゃんとDjango 2.2.7がインストールされ動くようになりました。
まとめ
- 人の書いたファイルもしっかり目を通そう
- 人任せにしちゃダメだ
- サイトからコピペするにしてもオプション周りは自分で調べて自分に合ったものを使おう
- パッケージをインストールするときはなるべくバージョン指定しよう