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

推荐订阅源

Y
Y Combinator Blog
博客园 - 司徒正美
TaoSecurity Blog
TaoSecurity Blog
Martin Fowler
Martin Fowler
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
S
Secure Thoughts
博客园 - 三生石上(FineUI控件)
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
K
Kaspersky official blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
H
Help Net Security
博客园 - 叶小钗
爱范儿
爱范儿
GbyAI
GbyAI
I
Intezer
M
MIT News - Artificial intelligence
Latest news
Latest news
Schneier on Security
Schneier on Security
T
Tor Project blog
Simon Willison's Weblog
Simon Willison's Weblog
I
InfoQ
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CXSECURITY Database RSS Feed - CXSecurity.com
罗磊的独立博客
N
News and Events Feed by Topic
T
The Blog of Author Tim Ferriss
V2EX - 技术
V2EX - 技术
B
Blog
T
Tailwind CSS Blog
N
Netflix TechBlog - Medium
Security Latest
Security Latest
V
V2EX
F
Fortinet All Blogs
Forbes - Security
Forbes - Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Hacker News
The Hacker News
Scott Helme
Scott Helme
P
Privacy International News Feed
P
Palo Alto Networks Blog
H
Heimdal Security Blog
C
Cisco Blogs
T
The Exploit Database - CXSecurity.com
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
G
Google Developers Blog
W
WeLiveSecurity
L
LINUX DO - 最新话题

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에만 코멘트로 남겨두었다.