Skip to content

ysw0421/ysw0421.github.io

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Jekyll Github 연동하기

참고 링크


목차

  1. 소개
  2. 설치와 GitHub 연동
  3. 구동 방식

1. 소개

1.1 등장 배경

  • 웹 사이트의 발전: static -> dynamic
    • static: DB 통신 없이 html, css 등의 정적 파일의 text를 바로 전달한다. 단순해서 빠르지만 자체 기능이 부족하고, 콘텐츠 수정이 힘들다.
    • dynamic: DB와 연동하여 댓글, 좋아요 등 다양한 기능이 가능하고, 콘텐츠 수정, 추가가 용이하다.
  • 하지만 개인 블로그나 간단한 사이트의 경우 필요로 하는 기능이 많지 않다. 대표적인 추가 기능들(댓글, form, 글 검색 등)이 각각 서비스화되면서(disqus, wufoo, typeform, google 등등) 정적 사이트로 블로그를 만들더라도 원하는 대부분의 기능을 충족할 수 있게 됐다.
  • 정적 사이트 엔진이 Jekyll 말고도 무려 400개나 된다.(참고링크)
  • Jekyll 창시자가 GitHub의 창업자이자 전 CEO인 Tom Preston-Werner다. 괜히 GitHub에서 호스팅도 제공하고 GitHub Pages에서도 자주 사용되는 등의 연결고리가 있는게 아니다. 현재는 Parker Moore(GitHub 직원)가 리딩하고 있다.
  • Jekyll은 ruby 언어 기반이지만 엔진을 커스텀해서 사용할 것이 아니라면 루비 문법을 알 필요는 없다.

1.2 단순 소개 페이지를 원한다면

  • 만약 단순히 어떤 페이지 하나를 소개 목적으로 만들고 싶은거라면(예: 모두의 딥러닝 페이지) 정말 간단해진다. Jekyll까지 갈 필요도 없다.
  • GitHub pages와 Jekyll Theme Chooser를 이용해서 테마 샘플 하나 선택하고, 내용은 README.md 파일로 대체하면 된다.

2. 설치와 GitHub 연동

2.1 Ruby 설치

  • OS X
    • 기본적으로 Ruby가 설치되어있지만, 구버전일 수도있어서 업데이트해야 한다고한다.
    • Homebrew 패키지 매니저 설치 : /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    • 루비 설치 : brew install ruby
  • Window
    • 루비 설치파일(2.4 버전 이상)을 다운받고 실행 : https://rubyinstaller.org/downloads/
    • 블로그 글 검색에서 DevKit을 설치하라는 건 2.4 미만 버전에 대한 것이므로 무시한다.
    • 설치 마지막에 MSYS2에 대한 언급이 있는데 설치해준다. 새 창이 떠서 1, 2, 3 중에 선택하라고 하는데 1번 정도까지는 추가로 설치해주자. 그 후엔 그냥 엔터 쳐서 종료.

2.2 라이브러리 설치

  • OS X : 터미널 열고 sudo gem install jekyll bundler
  • Window: cmd 열고 gem install jekyll bundler

2.3 GitHub 연동

  • 저장소 생성: GitHub에서 username.github.io 이름으로 repository를 만든다. username은 자신의 것으로 대체. 내 경우는 GitHub username이 'gyubin'이라서 gyubin.github.io로 했다.

  • 생성된 빈 repository를 clone하고(ex: git clone [email protected]:Gyubin/gyubin.github.io.git) 해당 디렉토리로 들어간다.

  • 내 로컬의 저장소에 들어간 상태에서 아래 명령어 순차 실행

    • new 뒤에 이름을 지정해서 새로운 디렉토리를 만드는 것이 일반적인데 우리는 로컬 저장소 디렉토리에 있기 때문에 현재 디렉토리로 . 지정해서 그냥 파일만 생성한다.
    • 로컬 서버 실행(http://localhost:4000/)되는 동안엔 파일 변화가 바로바로 적용된다. 미리보기 가능.
    jekyll new .
    bundle exec jekyll serve
  • 만들어진 파일을 실제 적용하고 싶다면 아래처럼 모든 파일을 commit하고 push하면 된다. 잠시 기다리면 내 주소(http://gyubin.github.io/)에서 미리보기에서 봤던 내용이 뜰 것이다.

    git add . # 모든 파일을 stage로
    git commit -m "Initialize Blog" # commit 하기
    git push

기본적으로 한 사이클은 돌았다. 앞으로 할 일은 웹사이트를 구성하는 html, css, js 파일들을 입맛에 맞게 수정하면 된다.

3. Jekyll 디렉토리 구조

Jekyll은 말 그대로 Static site generator다. 정해진 디렉토리에, 정해진 양식대로 파일을 넣으면 내 웹 사이트를 구성하는 html 파일들을 생성한다. 그리고 디렉토리 path와 동일하게 URI로 접근할 수 있다. 아래가 기본적인 파일 트리 구성이다.

.
├── _config.yml
├── _data
|   └── members.yml
├── _drafts
|   ├── begin-with-the-crazy-ideas.md
|   └── on-simplicity-in-technology.md
├── _includes
|   ├── footer.html
|   └── header.html
├── _layouts
|   ├── default.html
|   └── post.html
├── _posts
|   ├── 2007-10-29-why-every-programmer-should-play-nethack.md
|   └── 2009-04-26-barcamp-boston-4-roundup.md
├── _sass
|   ├── _base.scss
|   └── _layout.scss
├── _site
├── .jekyll-metadata
└── index.html # can also be an 'index.md' with valid YAML Frontmatter

앞에 _ 언더바가 붙은 폴더들은 Jekyll이 감지해서 build할 때 사용하는 폴더들이므로 규칙에 맞게 사용해야한다. 모두 안의 내용들을 건드릴 수 있지만 _site 폴더는 자동으로 생성되는 것이므로 건드려봤자 소용이 없다.(수정해봤자 다음 빌드 때 원상복귀된다)

jekyll build --source <source> --destination <destination> --watch 명령어로 옵션을 줘서 어떤 디렉토리를 이용할건지, 최종 생성될 폴더는 어디인지를 직접 지정할 수 있다. 디폴트는 각각 현재 디렉토리, 그리고 _site 폴더다. --watch 옵션은 파일 감지해서 자동 생성 가능하게 한다.

3.1 _includes

  • 코드 재사용을 위한 template partials가 위치하는 곳이다.

  • 한 웹사이트에서 footer, header 같은 것들은 어떤 페이지를 들어가도 같다. 그래서 하나의 파일을 만들어두고, 이 파일을 가져다가 쓴다.

  • 수정할 때 모든 페이지, 모든 포스트에 가서 header를 하나하나 수정할 필요없이 내 header 파일만 수정하면 되므로 수정에 매우 용이하다.

  • 확장자는 필요한 어떤 확장자도 가능하고, header 내용이 필요한 다른 파일에서 아래처럼 가져와서 사용한다. 아래는 html 파일에서 html partial을 가져와 쓰는 예다.

    ...
    {% include header.html %}
    ...
    

3.2 _layouts

  • 내 사이트에서 필요로하는 모든 템플릿 html 파일들이 위치한다.
    • 대표적으로 글마다 반복적으로 활용되는 post.html
    • 사이트 혹은 내 소개 내용을 담는 about.html
    • 내 연락처를 담는 contact.html
  • 내 사이트에서 어떤 페이지를 만들고싶다면 무조건 여기에 파일이 있어야한다고 생각하자.
  • 이 템플릿을 이용해서 다양한 글들이 만들어지고, 각 글의 제목 혹은 permalink에 따라 위치한 path가 달라지므로 css나 js를 불러올 때는 꼭 absolute path를 쓰는게 좋다.
  • 인터넷에 공개되어있는 좋은 theme을 보면 잘 만들어둔 html 파일들이 있을 것이다. 그런것들을 _layouts 폴더에 넣으면 된다.

3.3 _posts

  • Front matter 내용이 추가된 마크다운 형식의 들이 위치하는 디렉토리다.
  • 무조건 다음 포맷 YEAR-MONTH-DAY-title.MARKUP 으로 파일명을 지정해줘야한다.
  • 따로 permalink를 지정하지 않으면 저 파일명대로 디렉토리가 나눠져서 최종 내 글(html) 파일이 위치하게 된다.

3.4 _site

  • 따로 destination 디렉토리를 지정하지 않으면 디폴트로 _site에 모든 최종 파일들이 생성되게 된다.
  • 건드려서도, 건드릴 필요도 없는 디렉토리다.
  • 어차피 GitHub에 올리면 따로 생성되기 때문에 .gitignore 파일에 이 디렉토리를 추가해주는 것이 좋다.

3.5 _data

  • 사이트에서 활용할 정형화된 데이터 파일들이 위치한다. .yml, .yaml, .json, .csv 파일들이 위치함
  • site.data 로 어떤 파일에서든 호출해서 사용할 수 있다.
  • 만약 members.yml 파일이라면 site.data.members로 호출해서 사용 가능

3.6 _drafts, _sass

  • _drafts : 발행하지 않은 글 파일들은 단순히 title.markup 형태로 여기다 넣어두면 된다.
  • _sass : sass partials들이 위치한다.
    • main.scss 파일에서 호출해서 쓸 수 있다. ex) @import "base"; @import "layout"
    • main.scss는 build될 때 main.css로 알아서 jekyll이 만들어준다.
  • feed.xml: rss feed를 생성한다.

3.7 기타

  • 앞에 _가 붙지 않은 폴더들(css, images, js 등)과 일반 파일들은 Jekyll이 건드리지 않고 그대로 _site 폴더로 보내진다.
  • favicon.ico은 마음에 드는거 골라서 root 디렉토리에 넣어둔다.
  • _config.yml 파일은 아래에서 자세히 설명. 그리고 이 파일은 --watch 옵션이 설정되어있더라도 로컬서버 실행 중엔 변경 사항이 적용되지 않는다. 재시작해야함.

4. _config.yml

한 마디로 말해서 변수값들의 집합이다. Jekyll이 빌드할 때 사용하는 지정된 변수, 즉 Global configuration과 사용자가 어디서든 편하게 사용할 임의의 변수들도 있다. 지정한 변수들은 {{ site.var_name }}으로 어디서든 호출해서 사용할 수 있다.

공식문서 configurations에 엄청나게 많다. 대표적인 것만 추린다.

  • source: DIR : 디폴트는 현재 디렉토리 ./이고, 지정된 DIR path가 소스가 된다. 웹사이트에 대한 내용이 아니라 다른 코드도 해당 repository에 존재한다면 이렇게 구분하는 것도 좋은 방법이다.
  • destination: DIR : 디폴트는 ./_site 이고, 지정해서 다른 폴더로 만들 수 있다.
  • safe: BOOL : 플러그인이나 symbolic link들이 실행되지 않도록 한다.
  • exclude: [DIR, FILE, ...] : 빌드할 때 웹사이트와 관계없어서 제외할 파일들 명시
  • keep_files: [DIR, FILE, ...] : Jekyll이 빌드하지 않는, 다른 빌드 툴이 생성하는 파일들을 destination dir에 포함하고 싶을 때 사용한다.
  • timezone: TIMEZONE : America/New_York 혹은 Asia/Seoul 로 세팅
  • encoding: utf-8 : encoding 설정. utf-8이 디폴트값이다.
  • port: PORT : 로컬 서버에서 포트 설정
  • baseurl: "/blog" : 사이트의 기본 subpath 지정한다. index.html 파일이 표현되는 URI가 domain/blog 형태로 된다.
  • url: "" : hostname과 protocol까지 지정할 수 있다. 만약 내 고유 도메인을 이용하고 싶으면 지정해준다. ex) http://example.com
  • markdown: kramdown : 이게 기본이고 굳이 바꾸지말자.

5. Front matter

---
layout: post
permalink: about-jekyll
title: Blogging Like a Hacker
date: 2017-11-19 18:00:00 -0900
categories: ml optimizer
---

어떤 파일이든 YAML 형식의 block을 포함하고 있으면 jekyll이 다른 파일로 변환시킨다.(md 파일 뿐만 아니라 html 역시) 파일의 맨 처음 위치해야하고 dash 3개로 위처럼 구분되어야한다.

  • layout : 어떤 템플릿을 사용할건지 지정. 위 예는 _layouts/post.html 이라는 파일을 사용하고 있다.
  • permalink : 디폴트는 날짜와 title로 이루어진 URI인데, 위처럼 지정하면 gyubin.github.io/about-jekyll로 브라우저에서 접근할 수 있다. html 파일의 위치도 URI 구조처럼 root 디렉토리로 된다. permalink를 지정하면 categories와 date로 결정되던 파일 위치는 무시된다.
  • published : True, False로 설정해서 글로 안보여지게 할 수도 있다.
  • date: YYYY-MM-DD HH:MM:SS +/-TTTT 꼴로 쓰고 연월일 뒤는 생략가능하다. 파일명에 있는 날짜 정보를 오버라이드한다.
  • categories: ml optimizer : 공백으로 구분해서 카테고리 위계를 설정할 수 있다. 빌드하면 디렉토리가 ml 폴더 안에 optimizer 폴더 안에 날짜로 구분되어 html파일들이 생긴다.
  • tags: aa bb cc dd : 공백 구분해서 여러 태그를 설정해줄 수 있다.
  • comments: true : disqus로 댓글 설정할 때 꼭 이렇게 지정해줘야한다.

이렇게 설정된 변수들은 {{ page.title }} 형태로 템플릿에서 사용한다.

6. Liquid 문법

  • {{ }} : Output markup. 안에 쓴 객체가 html에 그대로 출력된다. {{ page.title }} 이라면 저 객체가 갖고 있는 값이 그대로 html에서 보여진다. 변수 정보는 다음 링크에 나와있다.
  • {% %} : Tag markup. 안에 쓴 내용이 html에 보이지 않는다. 반복 시작과 끝, 조건 시작과 끝을 나타낸다.
  • filter: <p>Posted {{ post.date | date: "%b %-d, %Y" }}</p> 처럼 쓴다. GitHub, 공식문서 참조.

7. Disqus

  • Disqus 사이트로 들어가서 회원가입하고, "site"를 하나 만든다.

  • 만드는 과정 중 아래와 비슷한 코드를 줄 것이다. 복사해서 _layouts 폴더에 "글"을 나타내는 템플릿에 붙여넣는다.

    {% if page.comments %}
      <div id="disqus_thread"></div>
      <script>
        var disqus_config = function () {
          this.page.url = "https://gyubin.github.io" + "{{ page.url }}";
          this.page.identifier = "{{ page.url }}";
        };
        (function() { // DON'T EDIT BELOW THIS LINE
        var d = document, s = d.createElement('script');
        s.src = 'https://gyubin.disqus.com/embed.js';
        s.setAttribute('data-timestamp', +new Date());
        (d.head || d.body).appendChild(s);
        })();
      </script>
      <noscript>
        Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a>
      </noscript>
    {% endif %}
  • 다음 두 변수 정도만 수정해주면 된다.

    • this.page.url : 해당 페이지(글)의 url을 지정해준다.
    • this.page.identifier : 페이지만의 유니크한 값을 지정해준다. 나는 domain 뒷부분 문자열을 사용했다.
  • 위처럼 urlidentifier를 설정해줘야 블로그의 글 마다 댓글을 다르게 띄울 수 있고 꼭 다른 값으로 설정하자. 같은 값으로 설정하면 conflict가 난다.

  • 글 내용 파일의 Front Matter에서 comments: true로 주는 것 잊지말자.

Releases

No releases published

Packages

No packages published

Languages

  • HTML 96.5%
  • CSS 1.9%
  • R 1.6%