Jekyll 이 파일 변경을 감지하지 못할 때 해결 방법
Intro
Jekyll 개발 환경을 세팅할 때 정말 편한 점은, 파일을 수정하면 자동으로 변경사항을 감지해서 즉시 빌드해준다는 점이다. 거기에 --livereload
옵션까지 준다면 브라우저를 새로고침 할 필요도 없다.
그런데, 동료의 PC에 jekyll 개발환경을 세팅해주던 중 문제가 발생했다. 아무리 파일을 수정해도 즉시 반영이 안된다.
내가 가진 리눅스 환경 및 맥북에서 모두 잘 작동하던 게 다른 동료의 맥북에서는 안 되었던 이유가 뭘까? 결론적으로는 --force_polling
옵션으로 해결했다.
본 글에서는 왜 이게 필요한지, 또 어떤 환경에서 이런 문제가 발생하는지 정리해본다.
현상
Jekyll 서버는 잘 뜬다. 로그도 잘 찍힌다. 하지만 파일을 수정하고 저장해도 아무런 재 빌드 반응이 없다.
bundle exec jekyll serve --livereload
이렇게 실행한 상태에서 index.html
을 수정해도 "Regenerating" 로그가 안 뜨고, 브라우저에서도 바뀐 내용이 반영되지 않는다.
서버를 종료하고 서버를 다시 띄우면 그제서야 변경사항이 반영되었지만 이런 상태로는 개발을 못한다.
원인
여러가지 시행착오가 있었지만 결국 찾아낸 원인은 동료의 PC에서 프로젝트를 설치한 경로가 외장 드라이브였기 때문이었다.
macOS에서는 기본적으로 파일 변경을 감지하기 위해 FSEvents라는 이벤트 시스템을 사용하는데, 이 FSEvents는 MacOS 의 표준 파일 시스템에서만 잘 작동한다.
즉, 외장 하드, 네트워크 드라이브, 클라우드 드라이브 등에서 작업하고 있다면 listen
gem이 내부적으로 감시를 하지 못하고, 결과적으로 아무 반응이 없는 것처럼 보이게 된다.
해결
--force_polling
옵션 사용
이 옵션을 쓰면 이벤트 기반 감시가 아니라, 일정 간격으로 파일 변경을 직접 확인하는 폴링 방식으로 감시하게 된다.
외장하드처럼 FSEvents가 지원되지 않는 환경에서도 제대로 작동한다.
bundle exec jekyll serve --livereload --force_polling
macOS의 권한 설정 확인
그 외에도 터미널에 전체 디스크 접근 권한이 설정되어 있는지 확인해보자.
시스템 설정 > 개인정보 보호 및 보안 > 전체 디스크 접근
에서 터미널이나 iTerm이 등록되어 있어야 한다.
결론
jekyll serve
가 변경을 감지하지 못했다면 --force_polling
옵션 하나로 간단히 해결할 수 있다.
그래도 가능하다면 Jekyll 프로젝트처럼 파일 변경 감지가 필요할땐 기본 내장 디스크에 저장하자.
폴링 방식은 리소스 낭비가 많을 뿐더러 저장 후 polling 주기 (기본 설정 1초) 동안 기다려야하는 단점이 있다.
References