저는 make
명령어를 매우 자주 사용 합니다.
이 명령어는 매우 오랜 역사를 지닌 빌드 도구 입니다.
여러 명령들을 서술해두고 골라서 실행 할 수 있고, 명령간 의존성을 정의 할 수
있기 때문에 요즘도 매우 유용하게 사용하고 있습니다.
make
명령어는 Makefile
을 읽어서 처리 하는 실행기로도 사용 할 수 있습니다.
유닉스 쉘스크립트 기반이지만, 비슷한 일을 하는 .sh
나 .bat
같은 실행기와는 다소 다른 문법과 컨텍스트 정책을 가지고 있습니다.
Unix 기반 OS 에서 대부분 기본으로 사용 할 수 있습니다. (Linux, Mac OS)
Windows의 경우에도 Windows용 make 프로그램을 설치하면 사용 할 수 있습니다.
Makefile
샘플제가 사용하는 것중 제일 간단한 파일 하나를 샘플로 설명 드릴께요.
Makefile
#!make
dev:
yarn start:dev
install:
brew install docker
npm i
clean:
rm -rf ./dist
rm -rf ./node_modules
docker:
docker build -t test-api .
docker-run:
docker run -ti -e PORT=3000 -p 3000:3000 test-api
#!make
는 shebang
이라고 부릅니다. 셔뱅~ 해시뱅~이걸 뭐라고 부를지 애매했다면, 기억하세요 공식 용어는 셔뱅
입니다.
(저는 오래전부터 발음을 모른채 쉬방
으로 읽어서 지금도 좀 문제가 됩니다.)
명령어이름: (이 자리에는 먼저 실행해야 하는 다른 make 명령들을 스페이스로 구분 입력할 수 있고 생략도 가능 합니다. 아래 예시를 참고하세요.)
(TAB) 쉘명령
(TAB) 쉘명령
...
예시)
start: init ready
ls -al
tree
// 실행 흐름
-> make start 를 실행하면,
-> 먼저 make init 를 하고 이 응답으로 Exitcode 0을 받으면 (성공 종료 신호)
-> 이어서 make ready 를 하고.. 이것 까지 성공하면
-> ls -al 을 하고.. 이것도 성공하면
-> tree 까지 실행하여 최종 명령인 tree의 exitcode 를 리턴하고 끝납니다.
cd xxx
후에 npm i
등의 작업을 연속으로 해야할 경우는 &&
를 이용해 한줄로 묶어줍니다.cd xxx && npm i
\
다음줄 연결자를 통해서 정리할 수 있습니다.cd xxx \
&& npm i \
&& npm build \
&& npm start
환경 변수를 사용하거나 자체 변수를 만들어 쓸 수 있습니다.
- (How to Use Variables)
$(변수명)
또는 ${변수명}
으로 사용할 수 있습니다.
make 내가만든명령어
하면 됩니다. 간단하죠.make
로 아무 명령어 없이 진행하면 가장 첫번째 명령어가 실행 됩니다.make
만 치면 가장 위의 명령어는 이름을 생략하고 실행할 수 있다는 것이죠..PHONY: default
라는 특수한 방법을 써야 합니다. .PHONY: default
thisisdefault:
ls -al
make
는 기본 명령어로 많이 쓰이므로 가장 자주 쓰는 명령어를 셋팅하면 좋습니다.make install
은 처음에 개발 환경을 준비할 때 좋습니다.make clean
은 개발 환경을 정리할 때 좋습니다.nodejs
는 package.json
이라는 자체 설정 파일이 있고, 그 하위에 scripts:
섹션이 있어서 거기에 명령어를 담아두고 npm run 명령어
or yarn 명령어
로 쓰기에 좋지만, 주석을 달 수 없고 JSON
형태를 유지해야 합니다. php
,python
,ruby
등은 따로 실행기가 없으므로 Makefile
을 활용해 보세요.Dockerfile
을 관리한다면 도커 빌드, 실행, 업로드등 할일이 많아지고 명령어가 복잡합니다. Makefile
을 쓰기 딱 좋은 곳이죠.저는 모든 프로젝트에 Makefile
를 애용 하는데 매우 직관적이며, 한번 만들어 두면 개발자끼리 공유하여 실수를 방지할 수 있고, Mac 과 Linux 어디서든 사용 가능하므로 개발 환경과 프로덕션 환경간에 차이 없이 실행 할 수 있기 때문 입니다.
Repository
마다 깔끔하게, 그리고 체계적으로 관리되는 Makefile
,
여러분의 프로젝트에 한번 적용해 보시는 것은 어떨까요?