일하는 장비가 맥 둘과 리눅스 하나인데 같은 저장소를 받아 쓰면서 자리가 제각각이었다. 스크립트에 경로를 적으면 다른 장비에서 안 돌고 메모해 둔 명령도 매번 고쳐 써야 했다.
Table of contents
Open Table of contents
배경 — 장비마다 다른 자리
경로가 다르면 스크립트와 메모가 장비에 묶인다. 같은 일을 하는 명령이 장비 수만큼 생기고 그중 하나만 고치면 나머지가 어긋난다.
문제는 경로 자체가 아니라 그것이 다른 모든 것을 장비별로 갈라 놓는다는 점이었다. 그래서 자리를 하나로 맞추는 것을 먼저 했다.
조치 — 같은 경로와 링크
홈 아래 ~/dev 로 통일하고 저장소 이름을 그 아래에 뒀다. 옮기는 데 삼십 분이 걸렸고 그 뒤로는 명령을 그대로 썼다.
경로를 정할 때 사용자 이름이 다를 수 있으므로 $HOME 기준 상대 경로로 잡았다. 대소문자 구분이 다른 파일 시스템을 고려해 전부 소문자로 했다. 외장 디스크에 두는 장비는 ln -s /Volumes/ext/dev ~/dev 로 걸어서 경로는 같고 실체만 다르게 만들었다.
막힌 지점 — 운영체제 차이를 흡수하는 자리
같은 자리에 둬도 명령 옵션이 운영체제마다 다른 것이 남았다. sed 의 제자리 편집이 대표적이었다. 리눅스 매뉴얼은 -i[SUFFIX] 로 접미사가 붙어도 되고 안 붙어도 된다고 적고 BSD 매뉴얼은 -i extension 으로 인자를 요구한다. 그래서 sed -i 's/a/b/' 가 리눅스에서만 돌았다.
그런 차이는 스크립트 안에서 uname 이 Darwin 인지 보고 갈라 두는 쪽을 골랐다. 이유는 호출부가 하나로 유지돼서다. 대신 스크립트마다 같은 분기가 몇 줄씩 반복되는 것을 감수했다. 필요한 도구가 깔려 있는지도 command -v 로 시작할 때 확인해서 없으면 이름과 설치 방법을 알려 주게 했다.
검증 — 장비 사이가 어긋났는지 본다
세 장비가 같은 지점을 보고 있는지를 git fetch 뒤 git status -sb 로 확인하는 명령을 만들어 작업 전에 돌렸다. 며칠 안 켠 장비가 밀려 있는 것이 그렇게 드러났다.
옛 상태에서 고치면 나중에 합칠 때 어긋난다. 확인 자체는 몇 초인데 안 하면 그 결과가 며칠 뒤에 병합 충돌로 돌아온다.
해 본 것 — 장비별 역할
셋을 같게 만들어도 실제로 쓰는 방식은 달랐다. 주 작업과 이동용과 시험용으로 역할을 정하니 무엇을 어디서 할지가 안 헷갈렸다.
큰 자료를 이동용 장비에서 다루려다 저장 공간이 모자란 적이 있었는데 역할을 정한 뒤로는 그런 일이 없었다. 역할을 적어 두니 어느 장비에 무엇이 있어야 하는지도 함께 갈렸다.
정리
- 장비마다 자리가 다르면 명령을 매번 고쳐 쓰게 된다
- 경로 차이가 스크립트와 메모를 장비별로 갈라 놓는다
- 같은 경로로 맞추고 실체가 다르면 링크로 잇는다
- 사용자 이름과 대소문자 구분 차이를 경로 규칙에 반영한다
- 운영체제 차이는 스크립트 안에서 흡수해 호출부를 하나로 둔다
- 필요한 도구를 시작할 때 확인하고 설치 방법을 알린다
- 장비 사이가 어긋났는지 작업 전에 확인한다
- 장비별 역할을 정하면 무엇을 어디서 할지가 갈린다