前回の訂正
前回の記事で以下のように記述した。
$ rbenv exec hanami new sample-bookshelf --database=mysql
このような実行をしたために、後々 config/environment.rb を修正する羽目になった。正しくは、以下のようにすれば良い。
$ rbenv exec hanami new sample-bookshelf --database=mysql2
ちゃんと --help
に書いてあった。
$ rbenv exec hanami new --help
Command:
hanami new
Usage:
hanami new PROJECT
Description:
Generate a new Hanami project
Arguments:
PROJECT # REQUIRED The project name
Options:
--database=VALUE, -d VALUE # Database (mysql/mysql2/postgresql/postgres/sqlite/sqlite3), default: "sqlite"
--application-name=VALUE # App name, default: "web"
--application-base-url=VALUE # App base URL, default: "/"
--template=VALUE # Template engine (erb/haml/slim), default: "erb"
--test=VALUE # Project testing framework (minitest/rspec), default: "minitest"
--[no-]hanami-head # Use Hanami HEAD (true/false), default: false
--help, -h # Print this help
Examples:
hanami new bookshelf # Basic usage
hanami new bookshelf --test=rspec # Setup RSpec testing framework
hanami new bookshelf --database=postgres # Setup Postgres database
hanami new bookshelf --template=slim # Setup Slim template engine
hanami new bookshelf --hanami-head # Use Hanami HEAD
エラーはいつも突然に
Hanami チュートリアルの Writing Our First Test にて以下を実施するようにある。
% HANAMI_ENV=test bundle exec hanami db prepare
実際に実行してみると以下のようなエラーが出た。
$ HANAMI_ENV=test bundle exec hanami db prepare
Mysql2::Error::ConnectionError: Access denied for user 'loginuser'@'localhost' (using password: NO)
(以下略)
MySQL のアカウントに loginuser なんて作っていないのでそりゃアクセスは拒否される。が、「なんで loginuser で DB に接続しようとしているんだ?」という素朴な疑問が湧いた。
ぐぐるな!一次ソースをあたれ!
@udzura さんが言っていた言葉である。実はぐぐっていたのだが、答えは一次ソースの中にあった。
まず先述の Writing Our First Test に以下のような記述がある。
Please check .env.test in case you need to tweak the database URL.
.env.test ファイルを参照してみる。
# Define ENV variables for test environment
DATABASE_URL="mysql2://localhost/sample_bookshelf_test"
SERVE_STATIC_ASSETS="true"
WEB_SESSIONS_SECRET="ないしょ"
RoR であれば database.yml に username/password を仕込むので、ここでも似たようなものかと思っていた。答えは Database Configuration にあった。
# .env.test
DATABASE_URL="database_type://username:password@localhost/bookshelf_test"
なんだ、こう記述すれば良かったのか。簡単じゃないか。
世の中そんなに甘くない
.env.test を修正のうえ、再度 prepare を実施してみると全く同じエラーが出る。これも前回の記事での誤りが影響している。
前回のエラーで ENV
を参照せずに、直接 mysql2://localhost/sample_bookshelf_development
を指定していたため、.env.test の DATABASE_URL
が無意味なものとなっていた。よって、
- config/environment.rb の model の adapter はデフォルト通り、DATABASE_URL を参照するようにする
- test 環境では .env.test の DATABASE_URL に username:password を設定
- development 環境では .env.development の DATABASE_URL に username:password を設定
とするのが正しいお作法のようである。
production 環境は?
ここで単純な疑問として「production 環境はどうすればいいの?」というものが思い浮かぶ。前回のエラーは production 環境である Heroku 上で動かした場合に発生している。そして、 .env.production なる設定ファイルは存在しない。
$ tree -a -L 1
.
├── apps
├── .bundle
├── config
├── config.ru
├── db
├── .env.development
├── .env.test
├── Gemfile
├── Gemfile.lock
├── .git
├── .gitignore
├── .hanamirc
├── lib
├── public
├── Rakefile
├── README.md
├── spec
└── vendor
どうすればいいものか?と思ってぐぐった(一次ソースのことはひとまず置いておこう)。
Hanamiを本番に載せたらdotenvを読まなくって困った話
これも解決手段のうちの一つであると思う。ベストプラクティスなのかどうかは分からない。
ひとまず疲れたので今日はここまで。