mdbook
사용법
mdbook
은 Rust 언어 기반의 커맨드라인 툴 & 라이브러리이다. 마크다운 파일을 이용해서 책을 만들 수 있다. Gitbook과 유사하지만, Rust 언어로 만들어졌다.
설치
바이너리는 릴리즈 페이지에서 다운로드 받을 수 있다. 그러나 난 이미 Rust를 PC에 설치한 상태이기 때문에 Cargo를 통해서 설치했다.
> cargo install mdbook
이외에 소스 레파지토리에서 직접 받아 빌드한 후 사용하는 방법도 있다.
프로젝트 구조
mdbook-test/
├─ book
└─ src
├─ chapter_1.md
└─ SUMMARY.md
src
디렉토리에 마크다운으로 작성된 파일들이 있어야 한다. 그리고 설정 파일 등이 들어갈 수 있다.book
디렉토리는 렌더링된 책이 있는 공간이다. 빌드된 결과물로 서버에 올리면 볼 수 있는 상태이다.SUMMARY.md
파일은 책의 목차를 작성하는 파일로 제일 중요하다. SUMMARY에 정의된 목차와 파일링크를 토대로 책이 렌더링된다.
CLI 명령어
init
: mdbook 생성
mdbook 보일러 플레이트를 생성하기 위해, init
명령어를 사용한다. .gitignore 파일을 생성여부와 책 제목을 묻는데, 책 제목은 소스 설정파일(book.toml
)에 저장된다.
> mkdir mdbook-test # mdbook 루트 디렉토리 생성
> cd mdbook-test/
> mdbook init
Do you want a .gitignore to be created? (y/n)
y
What title would you like to give the book?
mdbook demo
2018-12-15 10:16:30 [INFO] (mdbook::book::init): Creating a new book with stub content
All done, no errors...
build
: 소스를 기반으로 책을 렌더링
> mdbook build
SUMMARY.md
파일을 분석해서 책의 목차대로 렌더링한다.
기본 디렉토리는 book/
이지만 아래와 같이 사용자가 정의한 디렉토리에 빌드할 수 있다.
> mdbook build path/to/book
serve
: 렌더링 된 책 웹에서 보기
serve
명령은 localhost:3000
에서 HTTP를 통해 렌더링 된 책을 볼 수 있게한다.
> mdbook serve
2018-12-15 10:50:58 [INFO] (mdbook::book): Book building has started
2018-12-15 10:50:58 [INFO] (mdbook::book): Running the html backend
2018-12-15 10:50:58 [INFO] (mdbook::cmd::serve): Serving on: http://localhost:3000
2018-12-15 10:50:58 [INFO] (ws): Listening for new connections on [::1]:3001.
2018-12-15 10:50:58 [INFO] (mdbook::cmd::watch): Listening for changes...
test
: code block 테스팅
코드 블록의 테스트를 할 수 있다. 현재는 Rust 언어만 지원한다.
mdbook test
아래와 같이 코드 블록 3건이 있는데 각각 성공 / 무시 / 무시하는 시나리오이다.
```rust
fn main() {
println!("hello world");
}
```
```rust, ignore
fn main() {
println!("hello world");
}
```
```rust
// ignored
fn main() {
panic!("should panic!"); // should panic
}
```
결과는 아래와 같이 나온다.
> mdbook test
2018-12-15 11:01:47 [INFO] (mdbook::book): Testing file: "D:\\...\\til\\src\\log/mdbook-guide.md"
2018-12-15 11:01:49 [ERROR] (mdbook::utils): Error: Rustdoc returned an error:
running 3 tests
test C:\Users\...\mdbook-f7zZjj\log/mdbook-guide.md - mdbook::CLI_명령어::test (line 92) ... ignored
test C:\Users\...\mdbook-f7zZjj\log/mdbook-guide.md - mdbook::CLI_명령어::test (line 99) ... FAILED
test C:\Users\...\mdbook-f7zZjj\log/mdbook-guide.md - mdbook::CLI_명령어::test (line 85) ... ok
failures:
---- C:\Users\...\mdbook-f7zZjj\log/mdbook-guide.md - mdbook::CLI_명령어::test (line 99) stdout ----
thread 'C:\Users\...\mdbook-f7zZjj\log/mdbook-guide.md - mdbook::CLI_명령어::test (line 99)' panicked at 'test executable failed:
thread 'main' panicked at 'should panic!', C:\Users\...\mdbook-f7zZjj\log/mdbook-guide.md:3:3
note: Run with `RUST_BACKTRACE=1` for a backtrace.
', librustdoc\test.rs:367:17
note: Run with `RUST_BACKTRACE=1` for a backtrace.
failures:
C:\Users\...\mdbook-f7zZjj\log/mdbook-guide.md - mdbook::CLI_명령어::test (line 99)
test result: FAILED. 1 passed; 1 failed; 1 ignored; 0 measured; 0 filtered out
테스트가 실패하는 경우 오류가 발생한 라인번호만 나오고 출력하진 않는다.
수식 입력을 위한 MathJax 지원
MathJax를 선택적으로 적용할 수 있다. book.toml
파일에 아래와 같은은 설정을 추가하면 사용할 수 있다.
[output.html]
mathjax-support = true
기존 MathJax에선 >> ... >>
를 사용했다면, mdbook에선 \\[ ... \\]
방식으로 표현한다.
아래는 LaTex 커맨드로 작성한 수식이다.
\\[ x = \frac {-b \pm \sqrt {b^2 - ac}} {a} \\]
\[ x = \frac {-b \pm \sqrt {b^2 - ac}} {a} \] \[ \sqrt a \]
만약 인라인으로 작성하고 싶다면, \\[ ... \\]
대신 \\( ... \\)
로 쓰면 된다. \( T_1 = 2x \) 와 같이 렌더링된다.
CI
Travis CI를 이용해서 지속적 통합을 제공한다. github와 연동하기 위해 먼저 public repository에 접근할 수 있는 access token을 발급받는다.
tooken을 발급받았으면 아래와 같이 .travis.yml
파일에 deploy 관련 설정을 추가한다. local-dir
은 travis CI에서 실제로 소스를 pull 받은 경로를 넣어주면 된다.
deploy:
provider: pages
skip-cleanup: true
github-token: $GITHUB_TOKEN
local-dir: /your/local/directory/book
keep-history: false
on:
branch: master