한 동안 잘 사용하지 않다가 근래 다시 gitbook toolchain을 사용하고 있는데, gitbook toolchain이 가지고 있는 고질적인 문제가 있었다.

gitbook serve 명령을 통해 로컬 서버를 띄운 상태에서 내용을 작성하고 파일을 저장하면, 자동으로 re-generate하고 새로고침 하게 되는데 이 과정에서 오류가 발생하면서 서버가 죽어버린다.

처음엔 내가 뭘 잘못한건가 싶어서 여기저기 검색을 하고 다녔는데 알고보니 나만 이런게 아니더라는... 1

첫 번째 수정

무튼, 여차저차해서 처음 찾아낸 해결 방법은 로컬 서버를 띄운 뒤 _book/ 디렉토리를 삭제하는 거였다.

$ gitbook serve

$ rm -rf ./_book

어떤 이유에서인지는 모르겠지만 rm 명령을 주어도 실제로 파일이 삭제되지는 않고, 해당 이슈를 해결되었다.
하지만 로컬 서버를 띄울 때 마다 이 짓을 하려니 여간 귀찮은게 아니더라.

결국 근본적인 해결책을 찾으러 출발...

온갖 파일들을 뒤져보고 github issue들을 뒤져보고 나서야 해결책을 찾을 수 있었다.

내용이 너무 길어질듯 해서 github issue로 가보면 남겨진 코드가 있...

두 번째 수정

는 개뿔... 실패했다... (기존에 올려둔 코드가 있는데 간헐적으로 여전히 죽는 문제가 발견되었다. )

다시 해결책을 찾으러 긴긴 여행을... 가려다 다른 방법으로 해결책을 찾았다.

아예 npm script로 rm -rf ./_book을 실행되게 하면 될 것 아닌가?

해서 아예 Windows에서도 문제 없도록 rimraf를 설치하고 npm script로 gitbook serverimraf -rf ./_book를 모두 실행하도록 변경했다.

$ npm install --save-dev rimraf

package.json에서

{
  ...
  "scripts": {
    "preinstall": "(npm list gitbook-cli -g || npm install -g gitbook-cli) && (npm list rimraf -g || npm install rimraf -g)",
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "gitbook serve || rimraf -rf ./_book"
  },
  ...
}

이렇게 수정한 후,

$ npm start로 gitbook을 실행하니 이젠 아무 문제 없이 잘 된다!!!!

세 번째 수정

는... 역시 개뿔...

이게 노트북에서는 되는데 집 컴퓨터에서는 또 안되더라...

아무리 머리를 굴려봐도 안되는 이유는 결국 rimraf -rf ./_book의 실행 시점의 문제인듯 했다. 결국 안정적으로 _book 이 생성된 이후 해당 코드를 실행시키려면 병렬로 명령을 주되, 생성 시간 만큼 기다려주어야 하는 문제를 해결해야 했다.

일단 병렬로 NPM Script를 구동시키기 위해 'npm-run-all'을, 일정 시간 딜레이를 주기 위해 'delay-cli'를 사용해 보기로 했다.

$ npm install --save-dev npm-run-all delay-cli

그리고 병렬 구동을 위해 NPM script를 다시 수정...

gitbook servedelay 30 && rimraf -rf ./_book를 병렬로 수행시키도록 했고, 30초 딜레이를 준 것은 초기 generating에 걸리는 시간이 있어서 30초 정도로 우선 설정을 해두었다.

{
  ...
  "scripts": {
    "preinstall": "(npm list gitbook-cli -g || npm install -g gitbook-cli) && (npm list rimraf -g || npm install rimraf -g)",
    "test": "echo \"Error: no test specified\" && exit 1",
    "serve": "gitbook serve",
    "fixrefresh": "delay 30 && rimraf -rf ./_book",
    "start": "run-p serve fixrefresh "
  },
  ...
}

더불어 npm list rimraf -g 이 코드는 의도했던 것과 달리 0 depth로 설치된 것을 확인해주지 못해서 올바르게 돌아가지 못하고 있었던걸 나중에서야 발견...

다시 구글링을 통해 찾아보니 grep 말고는 답이 없겠더라...
해당 코드를 npm list --global --depth=0 rimraf | grep rimraf로 바꾸어서 보니 이젠 잘 확인이 되어서 원하는 결과로 이어지기 시작했다.

{
  ...
  "scripts": {
    "preinstall": "(npm list gitbook-cli -g || npm install -g gitbook-cli) && (npm list --global --depth=0 rimraf | grep rimraf || npm install rimraf -g)",
    "test": "echo \"Error: no test specified\" && exit 1",
    "serve": "gitbook serve",
    "fixrefresh": "delay 30 && rimraf -rf ./_book",
    "start": "run-p serve fixrefresh "
  },
  ...
}

이렇게 수정을 해 두고 나니 이제는 아무 문제없이 잘 되는 듯 했다.
수정하고 거의 보름 가까이를 gitbook 콘텐츠를 수정하면서 테스트 해봤는데 아직까지 아무 문제 없이 원하는 대로 잘 갱신이 이루어지고 있다.

해결 코드를 PR로 열까 했는데, Gitbook에서 CLI에 대해 공식적으로 deprecation 선언을 해버린 상황이라2 PR을 여는게 의미가 있을까 싶어 그냥 두고 issue에만 코멘트로 남겨두었다.


  1. 1.gitbook github issue를 뒤져보니 나와 같은 고통을 받는 이들이 있었다.
  2. 2.gitbook github README를 보면 작년 12월 28일에 Deprecation warning이 추가된 것을 확인할 수 있다.