Makefile 빌드 설정에 서버 주소와 키 값이 박혀 있었다. 환경별로 다른 값을 넣으려고 방법을 만들었는데 만들고 나서 그 도구에 이미 그 기능이 있다는 것을 알았다.
Table of contents
Open Table of contents
직접 만든 방법
파일을 두 벌 두고 빌드 전에 복사하는 방식이었다.
config.dev.h
config.prod.h
#!/bin/sh
ENV=${1:-dev}
cp "config.${ENV}.h" config.h
make
cp 로 덮고 make 를 부르는 몇 줄이라 돌긴 하는데 몇 가지가 걸렸다.
config.h 가 빌드마다 덮인다. 버전 관리에서 계속 변경으로 잡힌다
어느 환경으로 빌드했는지 결과물만 보고는 모른다
값이 하나 늘면 파일 두 벌을 다 고쳐야 한다
표준 방식이 있었다
문서를 다시 읽어 보니 Makefile 에서 -D 로 값을 정의할 수 있었다.
LOCAL_CFLAGS += -DSERVER_URL=\"$(SERVER_URL)\"
$ make SERVER_URL=https://dev.example.com
코드에서는 그냥 쓴다.
const char* url = SERVER_URL;
cp 로 파일을 복사할 필요가 없고 make 명령에 값을 준다.
왜 몰랐나
찾아보지 않고 만들었다. 환경별로 다른 값을 넣는다는 것은 흔한 요구이고 make 같은 도구에는 방법이 있을 가능성이 높다.
만들기 전에 물어볼 것을 정했다.
1. 이 요구가 흔한가? → 흔하면 방법이 있을 가능성이 높다
2. 도구 문서에 관련 항목이 있나?
3. 같은 도구를 쓰는 다른 프로젝트는 어떻게 하나?
3번이 특히 빨랐다. 사내 다른 프로젝트를 보니 이미 그 방식을 쓰고 있었다.
이름을 몰라서 문서 검색이 안 될 때 실제 사례가 그 이름을 알려 준다. svn 에서 몇 개를 받아 빌드 스크립트에 grep 을 걸면 어떤 인자를 주고 있는지가 바로 나온다.
만드는 데 걸린 시간보다 찾는 데 걸리는 시간이 훨씬 짧았다.
옮기는 것도 일이었다
이미 만든 것을 옮길지 판단했다. 값이 다섯 개고 쓰는 곳이 열 몇 곳이라 옮기는 데 반나절쯤 걸린다.
옮기기로 했고 이유는 -D 로 넘길 값이 계속 늘 것이라서다. 지금 다섯 개인데 열 개가 되면 파일 두 벌 관리가 더 번거로워진다.
앞으로 늘어날 것인지가 판단 기준이었다. 안 늘어날 것이면 그냥 뒀을 것이다.
검증 — 기본값과 빌드 스크립트
값을 안 주고 빌드하면 어떻게 되는지 정했다.
SERVER_URL ?= https://dev.example.com
API_KEY ?=
SERVER_URL 은 개발 서버가 기본이라 안전한 쪽이다. API_KEY 는 기본값이 없고 없으면 빌드가 실패하게 했다.
ifeq ($(API_KEY),)
$(error API_KEY 를 지정하십시오)
endif
빠뜨리면 안 되는 값은 기본값을 안 두고 실패시킨다. 기본값이 있으면 안 넣은 것을 모르고 넘어간다.
어느 환경으로 빌드했는지 알 수 있게도 했다.
const char* BUILD_ENV = SERVER_URL;
실행하면 BUILD_ENV 가 어느 서버를 보는지 알려 준다. 운영 빌드인 줄 알았는데 개발 서버를 보고 있는 경우를 잡았다.
make 인자를 매번 손으로 치면 오타가 나므로 빌드 명령도 스크립트로 남겼다.
# build-dev.sh
make SERVER_URL=https://dev.example.com API_KEY="$DEV_API_KEY"
# build-prod.sh
make SERVER_URL=https://api.example.com API_KEY="$PROD_API_KEY"
API_KEY 는 환경 변수에서 받고 스크립트에 값을 안 적었다. 이 스크립트는 버전 관리에 넣고 키가 든 환경 파일은 안 넣었는데 스크립트가 저장소에 올라가므로 키가 그 안에 있으면 이력에 그대로 남는다.
정리
- 만들기 전에 그 도구에 이미 방법이 있는지 확인한다
- 흔한 요구에는 준비된 방법이 있을 가능성이 높다
- 만드는 시간보다 찾는 시간이 훨씬 짧다
- 이름을 몰라 검색이 안 되면 같은 도구를 쓰는 곳을 본다
- 이미 만든 것을 옮길지는 앞으로 늘어날 것인지로 정한다
- 빠뜨리면 안 되는 값은 기본값을 안 두고 실패시킨다
- 기본값이 있으면 안 넣은 것을 모르고 넘어간다
- 결과물에 어느 환경으로 빌드했는지 심는다
- 빌드 명령을 스크립트로 남기되 키는 환경 변수에서 받는다