ファイル名の表記において大文字小文字を区別するかどうかに関してはMacとLinuxで扱いが違っており、それが過去においてもしばしば問題になってきました。
Macではファイル名の大文字と小文字は区別されません。
つまり「a.txt」と「A.txt」を同じフォルダ配下に作成できません。
なお、ファイル名としては「a.txt」「A.txt」いずれも作成可能です。あくまで両者が同一視されるだけです。
一方でLinuxではファイル名の大文字と小文字は区別されます。
つまり「a.txt」と「A.txt」を同じフォルダ配下に作成できます。
この違いがしばしば問題を生じさせてきました。
大文字小文字問題
例えば、ファイル「A.txt」を読み込むプログラムを作成したとします。
プログラム内で同ファイルを「A.txt」と表記したのであれば何の問題もありませんが、「a.txt」と誤記してしまった場合はどうなるでしょう?
実はMac上では問題なく動作してしまいます。先に示したようにMacではファイル名に関する大文字小文字の区別がないため、プログラム内で「a.txt」の読み込みを実行した結果として「A.txt」が問題なく読み込めます。
一方で同じプログラムをLinuxで実行するとエラーとなります。Linuxでは「a.txt」と「A.txt」は別物なので、「a.txt」の読み込みでは表記通り「a.txt」のみが対象であって、「A.txt」で代替することはできません。
以前MAMP環境で開発を行っていた際はこの問題が散発していました。
開発環境で十分動作検証を行ったプログラムを実サーバ(Linux)にデプロイし、改めて動作確認を行った際に呆気なくエラーが発生した場合は最初に本件を疑うのは鉄則で、概ねその予測は当たっていました。
そもそも、Mac(UNIX)とLinuxが極めて類似性の高い環境だからと言って、将来的にLinuxで動作させるプログラムの動作検証の大半をMacで実施すると言うこと自体いかがなものかと言う思いもあり、昨今ではVirtualbox上でサーバと同じOS(Linux)を動かし、ここでプロダクトの動作検証を行うようにしていました。
これで先の大文字小文字問題も解消、と思っていたのですが…
大文字小文字問題再び
先日、Mac上のVirtualbox+Linux(Ubuntu)環境で十分動作確認を行ったプログラムを実機にデプロイして動かしたところ、呆気なくエラーになりました。
原因を確認したところ例によって大文字小文字の誤記だったのですが、当然ながら何故Virtualbox環境で同問題を検出できなかったかと言う点が問題となります。
結論から言えば、ホストOS(Mac)とゲストOS(Ubuntu)で共有しているディレクトリ環境では大文字小文字は区別されないようです。
例えば「/tmp」配下のように純粋なゲストOS環境では「a.txt」「A.txt」の両方を作成することができます。
一方でホストOSとの共有ディレクトリ上では「a.txt」と「A.txt」は同一視され、両方を共存させることはできません。
よくよく考えてみれば当然で、ゲストOS側では大文字小文字の区別があるからと言うことで共有ディレクトリに「a.txt」と「A.txt」の両方を作成できると仮定すると、大文字小文字の区別がないホストOS側で両ファイルがどのように見えるかを考えた段階で破綻します。
プロダクト関連のファイルはgitで管理しますが、Linux上のコマンドを使用するよりはMac上のSourcetreeなどのアプリを使用した方が便利なので、その意味でプロダクト関連のファイル管理環境はホスト・ゲスト両OS共有のディレクトリ配下にしています。
個人的にはエディタとしてVimを愛用しているでの該当しませんが、一般的にはVSCodeなどを使ってファイル編集を行う人が多いと思うので、その意味でもプロダクト関連ファイルは共有環境に配置し、ホストOS側で編集し、ゲストOS側で動作検証を行うのが一般的かと思います。
上記のように、実装作業自体はMac上で行うものの、動作検証に関しては実サーバと同等のLinux環境で行っているということで開発環境での動作検証結果にかなりの信頼感を持っていたのですが、今回紹介した大文字小文字の区別に関してはその限りではなかったようです。
対策としては、ゲストOS上にホストOSとの共有環境とは別の動作検証専用環境を用意し、そこにプロダクト関連ファイルを展開して動作検証を行うと言うことになるかと思います。
日常的な動作検証は共有環境で行っておいて、デプロイ前のみ専用環境で全体を通した確認を行う程度で良いと思いますし(あくまでカバレッジ100%のテストケースが用意されていることが前提ですが)、最新ファイルの展開自体はgitコマンドで簡単に行えるので動作検証環境を複数持つこと自体もあまり負担にはならないと思われますので。
所感
Linuxで動作確認していることで大文字小文字の誤記も含めてチェックできていると思っていましたが、思わぬ落とし穴がありました。
しかし、動作検証にVirtualbox環境を使うようになって結構年月が経つので、ここに来て初めて本問題に気づいたと言うことが結構意外です。
繰り返しになりますが本問題は以前(MAMP利用時)はしばしば発生していたので、単に誤記の頻度が減ったのかも?と好意的に解釈するのは簡単ですが、何か他の要因があることも考えてみるべきかもしれません。
なお、Virtualbox環境に関して言及していますが、dockerでも同様の問題があるようです。個人的には未検証ですが、理屈から考えても同じ問題があると思った方が自然です。
ところで、今回は大文字小文字を区別しないホストOS(Mac)と区別するゲストOS(Linux)という関係でしたが、逆の場合はどうなるんでしょうね?
まぁ、そのような使い方をすることはないので、深く追求するつもりもありませんが…