初めに
プロジェクトの一環として、先輩から任されたツール作成。
この手のタスクにもだいぶ慣れ、サクッとLaravelでコードを書き上げる。
いつも通りローカルで念入りに動作確認し、無事に動くことを確認する。
そしてAWS上の保守環境へ適用するためにパイプラインを実行。
いざ画面で動作確認...
すると、エラー画面へ遷移。
何度やってもエラー画面。
「なぜ?」と思いながらCloudWatchへ。
ログ「そんなファイルないぞ」
私「え?」
事象
ローカルでは問題なく動いていたコードが、保守環境(AWS)上に挙げたところ動かなくなった。
エラー内容:
View [pages.tool.TestView] not found.
結論
ファイル名の大文字小文字は正確に打ちましょう。
OSによっては読み込まれないことがあります。
ディレクトリにも大文字小文字を不用意に混ぜないようにしましょう。
詳しいお話
今回引っかかったのがコントローラー内の以下のコード。
return view('pages.tool.TestView', ['action' => 'get']);
実際のファイル構造はこんな感じ
views
└pages
└Tool
└ TestView.blade.php
...皆さんもわかっただろう。
"tool"と"Tool"のタイポという、ひっっじょうにしょうもないミスである。
「じゃあなんでローカルだと動いたの?」という話であるが、
どうやらローカルと保守環境のOSの違いが原因だったらしい。
ローカル環境 | 保守環境 |
---|---|
PHP ビルドインサーバー | AWS EC2インスタンス |
Windows | Linux |
ここでこちらの記事から引用させていただくと、
PHPは文法においては大文字小文字を区別しない(ケースインセンシティブ)。
しかしファイル名となると、
これは実はPHPは関係なく、ファイルシステム(OS)に依存します。
一般的にWindowsやmacOSのデフォルトのファイルシステムではファイル名はケースインセンシティブ(大文字小文字を区別しない)、GNU/Linuxではケースセンシティブ(大文字小文字を区別する)です。
つまり、PHPの文法上ではifだろうがIfだろうがIFだろうが許容されるものの、
ファイル名は大文字小文字をしっかり区別しうるのだ。
そして今回は、ローカル環境がケースインセンシティブなWindowsだったのに対し、
保守環境がケースセンシティブなLinuxだった。
そのため、ローカルではちゃんと動いたにもかかわらず、保守環境上ではファイルが正しく読み込まれなくなったという話。
まとめ
ファイルやフォルダの命名規則はちゃんと守って、
大文字小文字はちゃんと区別しておきましょう。
こんなしょうもないミスに1時間もかかったとか恥ずかしくて言えない
OSによる文字区別については、経験のあるエンジニアの皆さんには常識かもしれないが
自分にとってはかなり衝撃的だった。
ちゃんとサーバーやOSについても理解を深めたいと思った次第...
参考ページ
・ローカル環境(XAMPP)では読み込めたのに、サーバーにアップすると読み込めないファイルが…。原因はファイル名にある?(https://incloop.com/file-case-differences/)
・Q. PHPは大文字小文字を区別するか?(https://qiita.com/tadsan/items/6c6329eeb43929271119)