이미지를 수정했는데 게임에 반영이 안 됐다. 파일을 찾아보니 같은 이름의 파일이 네 곳에 있었다.
Table of contents
Open Table of contents
사본이 네 벌이었다
SVN 에서 관리하는 것과 빌드가 복사한 것과 원본 작업 파일과 작업 중인 파일이 있었다. 내가 고친 것은 세 번째였다.
네 벌이 있다는 것 자체는 이유가 있었다. 작업 파일은 레이어가 살아 있어야 하고 소스는 게임에 들어갈 형태여야 하며 산출물은 빌드가 만든다. 문제는 그 관계가 어디에도 안 적혀 있었다는 점이다.
네 파일이 정말 같은지도 md5sum 로 봤다. 소스와 빌드 산출물은 값이 같았는데 작업 파일과 소스 파일은 달랐다. 이름이 같다고 내용이 같은 것이 아니다.
복사 방향을 확인했다
빌드 설정을 보니 assets 폴더가 APK 에 들어가고 그 폴더는 빌드 스크립트가 소스 폴더에서 복사하고 있었다.
즉 소스 폴더를 고쳐야 하고 assets 를 고치면 다음 빌드에서 덮인다. 복사 방향을 알아야 어디를 고칠지가 정해진다.
폴더마다 역할을 정했다
각 폴더가 무엇인지 적고 산출물 폴더에는 svn propset svn:ignore 를 걸었다. 산출물이 소스와 같이 관리되면 커밋 내역이 두 배가 되고 어느 쪽이 진짜인지 헷갈린다.
작업 폴더 안도 정리했다. 작업 중인 것과 확정된 것과 옛날 것이 섞여 있어서 셋으로 나누고 내보낸 결과에서 소스로 옮기는 것을 스크립트로 만들었다.
CNT=$(ls "$SRC"/*.png 2>/dev/null | wc -l)
[ "$CNT" -eq 0 ] && { echo "내보낸 파일이 없습니다"; exit 1; }
cp -v "$SRC"/*.png "$DST/"
echo "${CNT}개 복사"
손으로 복사하면 빠뜨리고 스크립트로 하면 개수가 나온다. 대상이 없으면 실패하게 한 것은 빈 폴더에서 조용히 성공하는 것을 막기 위해서다.
반영 확인
어디를 고칠지는 알았으니 반영됐는지 확인할 방법이 필요했다. APK 는 압축 파일이라 unzip -p 로 안의 것을 꺼내 해시를 비교했다.
$ unzip -p bin/game.apk assets/char/knight_01_idle.png | md5sum
$ md5sum resource/char/knight_01_idle.png
두 값이 같으면 반영된 것이다. 만든 쪽이 아니라 실제로 실행되는 쪽에서 확인하는 것이 요점이었다.
정리
- 같은 이름의 파일이 여러 벌 있으면 어느 것이 쓰이는지부터 확인한다
- 이름이 같다고 내용이 같은 것이 아니므로
md5sum로 비교한다 - 복사 방향을 알아야 어디를 고칠지 정해진다
- 산출물을 고치면 다음 빌드에서 덮인다
- 폴더마다 역할을 정하고 적어 둔다
- 산출물에는
svn:ignore를 걸어 커밋 대상에서 뺀다 - 복사는 스크립트로 하고 대상이 없으면 실패하게 한다
unzip -p로APK안을 꺼내 실제로 실행되는 쪽에서 확인한다