Post

Mac OS, Linux, Windows File System Case-sensitive

난 항상 리눅스용 서버 개발에 MacOS 가 좋다는 말에 굉장히 부정적인 입장인데… 이번에 관련 이슈 때문에 다시 한번 느끼게 되었다. 현재 MacOS 는 파일 시스템으로 APFS 를 쓰고 있는데, 이 파일 시스템은 기본적으로 대소문자를 구별 하지 않는 시스템이다. 포맷 시에만 이 옵션을 바꿀 수 있다.

오늘 Protocol Buffer 를 다루다가 관련 이슈가 생겼는데… option java_multiple_files = true; 옵션이 있을 경우, protoc 는 Outer Class 와, Message Class 를 각각 별도의 파일로 생성 하게 된다 여기에서 이슈가 생기는데 mytest.proto 에 message MyTest{} 가 있을 경우 2개의 파일을 생성 하게 되는데…

  1. 대문자로 시작하고, _를 대문자로 치환한 이름의 Outer Class
  2. Message의 이름을 그대로 따라가는 Message Class

즉 MyTest.java 와 Mytest.java 가 생성 되게 된다.
이게 리눅스에서 사용 하는 파일 시스템 에서는 구별이 되니 상관 없는데… MacOS 나 Windows 에서는 같은 파일로 인식 되기 때문에, 나중에 생성된 Mytest.java 가 MyTest.java 를 덮어씌워버려 파일 하나가 사라지게된다.
이걸 피하려면 명시적으로 option java_outer_classname 을 지정하여 이름을 바꿔주면 되지만… 이번 경우는 내가 proto 파일을 수정 할 수가 없는 상황 이었다

이게 Windows 면 간단히 해결 가능한데, fsutil file setCaseSensitiveInfo [FolderName] enable 로 해당 프로젝트 폴더만 대소문자 구별을 켜면 간단히 해결 가능 하기 때문이다
그런데 이게 MacOS 면 좀 머리가 아픈데….초기화 시에만 파티션 단위로만 변경 가능하고, 대부분의 SW 는 대소문자 구별 안함에 맞춰져 있기 때문에 많은 경우 저 옵션을 바꾸면 SW 들의 정상 동작을 보장할 수 없다. 게다가 회사 보안프로그램이 깔려 있는 머신을 내 맘대로 바꿀 수도 없고…

그래도 뭐 대안이 없는건 아닌데… 가상디스크 이미지를 하나 만들고, 그걸 마운트 하는 식으로 사용 하면 된다. 그 방법은 대충 이렇다

1
2
hdiutil create -size 10g -type SPARSEBUNDLE -fs "Case-sensitive APFS" ~/case-sensitive.dmg
hdiutil attach ~/case-sensitive.dmg

뭐 아무튼 오늘 protoc 가 파일 안 만들어 줘서 당한 썰 풀었다…

protoc 만드는 애들은, 이런 케이스에 오류좀 내 주면 덧나냐….


PS. 만약 리눅스 기준으로도 이름이 겹칠 경우 OuterClass postfix 를 자동으로 붙여 준다. protoc 가 Windows / Mac 에 대한 고려가 없는 것…

This post is licensed under CC BY 4.0 by the author.