惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
大猫的无限游戏
大猫的无限游戏
S
Securelist
The Hacker News
The Hacker News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
F
Fortinet All Blogs
Jina AI
Jina AI
K
Kaspersky official blog
T
Threat Research - Cisco Blogs
Stack Overflow Blog
Stack Overflow Blog
Webroot Blog
Webroot Blog
有赞技术团队
有赞技术团队
T
The Blog of Author Tim Ferriss
量子位
S
Schneier on Security
Latest news
Latest news
D
Darknet – Hacking Tools, Hacker News & Cyber Security
O
OpenAI News
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
博客园 - 叶小钗
L
LINUX DO - 最新话题
V
Visual Studio Blog
U
Unit 42
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
Security Affairs
AWS News Blog
AWS News Blog
S
Secure Thoughts
腾讯CDC
Cloudbric
Cloudbric
H
Help Net Security
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
C
Cyber Attacks, Cyber Crime and Cyber Security
WordPress大学
WordPress大学
The Last Watchdog
The Last Watchdog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 【当耐特】
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
D
DataBreaches.Net
A
About on SuperTechFans
G
GRAHAM CLULEY
Forbes - Security
Forbes - Security
Hugging Face - Blog
Hugging Face - Blog
Martin Fowler
Martin Fowler
Vercel News
Vercel News
Cisco Talos Blog
Cisco Talos Blog
NISL@THU
NISL@THU
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Know Your Adversary
Know Your Adversary

The Tracks of mulder21c

Atomic Design + Storybook 적용 후기 json-server에 사용자 인증 구현하기 개발환경 WSL2 + zsh로 갈아타기 pass function as props in vue 2020년 회고 colum flexbox에서 padding bottom 문제 해결 Nuxt를 통해 보는 프론트엔드 개발자가 하는 일 Nuxt Router kebab-case 처리 JS to SCSS 변환 Nuxt + Storybook 통합 하기 2020 이직 이야기 2020 이직 이야기 2020 이직 이야기 2020 이직 이야기 Windows에서 PM2 실행 오류 해결 오픈톡 정지에 대한 카카오톡 고객센터 후기 배려에 대한 단상 학습이 잘 되지 않는 이유 웹팩 4 마이그레이션 삽질기 babel 7 업데이트 후 node_modules 패키지가 변환되지 않는다면? white space는 4px이다? 정말? 2020년 시간 관리를 위해서 도입 한 툴들 Codility Lesson 5 — PassingCars 2019년 회고 Codility Lesson 4 — MissingInteger Codility Lesson 4 — MaxCounters Codility Lesson 4 — FrogRiverOne Codility Lesson — PermCheck 착각은 자유가 아닌각 세미나 진행 후기 Codility Lesson 3 — tapeEquilibrium Codility Lesson 3 — PermMissingElm Codility Lesson 3 — FrogJump 알고리즘 연습을 다시 시작했다. Codility Lesson 2 — CyclicRotation Codility Lesson 2 — OddOccurrencesInArray Codility Lesson 1 — BinaryGap 아이패드 구매 하고 3주 써 본 기록 세미나 어떻게 준비해야 할까? HTML은 웹이다 접근성 향상을 위한 이름 짓기 접근성 교육에서 자주 나오는 상위 5가지 질문 접근 가능한 숨김 텍스트 크로스 브라우징이란? 블로그 테마 만들기 시작 2018년 회고 학습에 대한 오해 모르는 사람에게 질문할거면 예의 좀 지켜라 파이썬으로 웹 크롤러 만들기 해쉬 링크 오프셋 조정하기
깃북 파일 저장 시 오류 문제 해결
멀더끙 · 2019-02-07 · via The Tracks of mulder21c

한 동안 잘 사용하지 않다가 근래 다시 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에만 코멘트로 남겨두었다.