エラー
rspecでテストを書いて、走らせようとしたとき(rspec ファイル名.rb)に以下のエラーが出て走らせることができなかった。
No such file or directory @ rb_sysopen -config/apns/server_certificates_sandbox.pem (Errno::ENOENT)
エラー原因
config/apns/server_certificates_sandbox.pemというファイルがない
そもそもどこで「ファイルが必要」とされ、apnsって何で、pemって何
そもそもどこで「ファイルが必要」とされているか
- config/initializers以下のapns.rb
- initializersはrails起動時に読み込まれるファイル
apns.rb中身
apns = []
Settings.apns.certificate_file_names.each do |certificate_file_name|
apn = Houston::Client.production
apn.certificate = File.read("config/apns/#{certificate_file_name}")
apns << apn
end
APNS = apns
確かにconfig/apns/以下のファイルを読み込むようになってる...
じゃあapnsって何、.pemって何
Appleのプッシュ通知に使うための秘密鍵らしい
確かにない。
requireファイルを指定しているファイルを覗いてみる
config/settings/development.local.ymlみてみる
apns:
certificate_file_names:
'dummy_for_test.pem'
あれ、server_certificates_sandbox.pemはrequireされてない。。?
あ、テスト実行してるから、config/settings/test.local.ymlに書かれてるんだった
apns:
certificate_file_names:
'server_certificates_sandbox.pem'
確かにserver_certificates_sandbox.pemが必要って言ってるのに、該当ファイルがなくてエラーが出ているだろうことが確認された。
必要とするコードがあるなら何故該当ファイルがなくなった(内輪事情)
元々server_certificates_sandbox.pemはあったらしいのだが、秘密鍵が描かれているので、githubにあげるのはマズイだろうということで、サーバーに置いておくことにしたらしい。
そのファイルだけをrailsプロジェクトから消して、しかしながら、そのファイルを必要とするコードは(本番環境ではサーバーに置くことにした鍵を使って)まだ使うため、残っていて、サーバーの秘密鍵を取れないlocal環境ではエラーが出た。
ということ。(スッキリ!)
解決方法
- touch config/apns/server_certificates_sandbox.pem
ないって言われてるなら作っちゃえ
(ただgitにコミットしない配慮必要) - config/settings/test.local.ymlの'server_certificates_sandbox.pem'を消す
そしたら読み込むべきファイルなし、ということになるので、エラーは出なくなる
こちらはlocalファイルなので、(.gitignoreしている限り)毎回コミットするときにこのファイルはコミットしない、という配慮は必要なくなる