使用静态博客生成器Nikola建立个人主页
Establish Your Individual Blog Using Static Blog Generator NIKOLA
是的,这就是目前这个博客所利用的构建套件,基于Github上特殊的免费代码仓库Github Pages(300M空间)和静态博客生成工具Nikola(链接见底部)。
Why Static Websites?
Static websites are safer, use fewer resources, and avoid vendor and platform lock-in.
相比较WordPress等功能完善强大、插件生态丰富的主流动态博客软件,静态博客软件的功能显得比较有限,但是胜在良好的平台迁移性、极快的渲染速度(根本就是提前渲染好的)以及很低的上手成本。Static Blog不需要配置Apache或者Nginx等服务器端软件来处理页面请求,而是使用Python构建的模拟服务器,serve已经预先渲染好的页面样式,因此响应速度非常令人满意,资源占用很低,环境配置也简化到了一定程度。对于不喜欢过分折腾者,这些特性应该足够使得静态博客软件成为首选。然而遇到问题时,如果对于前端技术没有了解的话恐怕折腾起来也会比较头疼的吧。
目前与Gitpages最紧密耦合的静态博客软件无疑是Jekyll,样式非常漂亮,也比较方便使用。但是本人作孽尝试了一下传说中丝一般顺滑的Nikola,也还是比较满意的。另外Hexo的风评也还不错。
本人机器的平台是Mac OSX Yosemite,如果你是Windows用户,可能会在以下教程的Python环境搭建部分多费周折,并且我不一定能帮得上忙……
使用Github Pages搭建个人博客
Prerequisites
如果你是一个程序员,应该跳过以下列表的所有项目直奔主题……
- 首先你当然要有一个包管理软件,比如Homebrew、easy_install之类(什么你告诉我你没有安装brew!pia\~),当然最好两个都要有,因为我在安装接下来的pip时就遇到了一些小麻烦(撞墙),brew安装失败,easy_install成功,两个包管理系统的源还是有一些差别的(最好的方案自然是开可靠的全局代理然后刷新缓存);
- 然后你需要有Python,最好是2.7.x版本或者3.x(Yosemite自带的应该是2.7.6,足够了),Nikola和相关依赖套件都是基于Python的开发环境构建的;
-
Python的包管理软件是必备,比如(但不仅限于)pip,使用Mac的命令行包管理软件安装:
sudo brew install pip
或者sudo easy_install pip
;以及据我测试,如果不走代理的话pip的许多源是retrieve不下来的; -
需要有Github的账户,当然……
- ……当然你还会在本地安装它全家:命令行版本管理工具Git,以及非必备的Desktop客户端Github; 噢,准备就绪,开始吧。
安装Nikola及其Python依赖库
本部分的引用见官方文档,这里仅加入我碰到的一些小问题的解决之道。
-
virtualenv
相当建议,但不是必须。折腾Python开发的应该都有用过这玩意儿——除非你想把本地的Python依赖环境搞得一团糟。可以用pip安装它,完事后
virtualenv [DIR_NAME]
就会在当前文件夹下根据参数中指定的文件夹名字创建一个虚拟Python环境(显示为同名文件夹),内部带有一些基本工具,默认是继承系统中已经存在的库的(但是可以在virtualenv的参数里面修改,具体不展开);下面讨论中假定这个文件夹的名字是Nikola。cd
进刚才创建的文件夹,运行命令source ./bin/activate
,看到命令提示符前面出现了Nikola的字样;现在安装各种库都与本机原有的Python环境隔离,在退出虚拟环境后是仿佛不存在的。调试完后deactivate
就可以退出当前虚拟环境,当然记得下次在本地调试Nikola的时候还得记得activate起来。虽然看似麻烦点,但是对于开发多个Python项目、甚至需要引用不同版本的同一个库者是减少了很多无谓的细节和问题的,我认为相当值得。 -
Installation
在Nikola文件夹中activate起来后,
pip install nikola
,看看缺啥,缺啥补啥。常见问题大致如下: - 缺失库依赖libxml/libxslt,用系统中带的包管理(apt-get、brew等)安装搞定:sudo brew install libxml2-dev libxslt1-dev zlib1g-dev
CentOS、RedHat之类用yum做包管理的需要把dev写成devel,下面一个常见错误同理:
sudo yum install libxslt-devel libxml2-devel zlib-devel
-
编译时提示缺失Python.h,如果之前做过Python开发用过Django什么的应该已经知道如何解决(或者不会遇到):
sudo brew install python-dev
当然这种库依赖如果用pip能retrieve到的话通常会更好,经验来看,版本新一些。
-
在本地测试大概不会遇到下面这个问题,但是我在把Nikola Blog备份到DigitalOcean的低配VPS上时恰好遇到了: error: command 'x86_64-linux-gnu-gcc' failed with exit status 4
Google了一下,发现StackOverflow上还挺多人遇到过这个问题的:
No more free memory on lowest cost DigitalOcean VPS…
Add swapfile: sudo dd if=/dev/zero of=/swapfile bs=1024 count=524288 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
From:
https://github.com/pydata/pandas/issues/1880#issuecomment-9920484
-
不是吧……内存爆了……虽然只有512M但是那可是跑的Ubuntu不是Windows啊 0.0
初始化并部署站点
使用如下命令初始化一个站点:
nikola init [--demo] sitename
如果你需要把这个Nikola渲染出来的静态博客部署到Github Pages,那么务必注意你创建的sitename必须是NameOfYourGitAccount.github.io,它也将成为个人账户对应的唯一GitPages Repository的名字。如果有这个需求(就如同本博客),还要特别注意的是必须在一个master之外的branch中放置源代码文件(比如deploy),并把master branch留空给build和部署时自动生成的内容,不作任何手动修改;鉴于自动部署时master实质以源文件branch中output/填充,因此也不建议在该文件夹中手动放置任何文件。
带上demo选项的话,自动生成的博客站点会带有一些可供测试、模仿和查看的特性样例,可以先尝试一下。
以下命令创建一篇新的Blog Post:
nikola new_post [-markdown]
然后会被要求输入PostName,自动生成在posts/post-name.mdown
,其中post-name是PostName的“Tidy Version”,仅包含英文小写和断词的hyphen;不指定Markdown格式选项的post会默认以*.rst的reStructedText格式生成。以外部的任何好用的富文本编辑器去编辑这些源文件都是可以的,比如我会交替、互补地使用Ulysses、Mou和Sublime Text等。
引用的图片被放置在images/中,在posts源文件中以../
的URL直接引用到images/中的文件路径。
编辑完成各篇博文后,nikola build
来渲染出静态博客的内容,如果有配置文件错误等问题,这时会给予提醒;nikola serve
来启动一个基于Python的最精简SimpleHTTPServer来在本地启动serve站点内容,可以通过浏览器访问localhost:8000
来查看效果;如果是在远端的服务器上操作,那么可以通过公网IP+端口号访问到。serve命令可以有选项指定端口参数等,具体可以通过nikola的-help
选项查询,不加赘述。
如果测试无误或者不需要测试,部署到Github Pages只需要nikola github_deploy
命令就可以了,一次性build、add、commit和push;当然记得不是在master branch下操作……
一些必要的配置优化
Nikola的全局配置文件在站点根目录下的conf.py,官方文档讲得很详细,这里提及必不可少或者强烈推荐的几点优化。
-
基本信息
# Data about this site BLOG_AUTHOR = "Your Name" # (translatable) BLOG_TITLE = "Demo Site" # (translatable) SITE_URL = "http://getnikola.com/" BLOG_EMAIL = "joe@demo.site" BLOG_DESCRIPTION = "This is a demo site for Nikola." # (translatable)
-
POSTS格式
# POSTS and PAGES contains (wildcard, destination, template) tuples. # # The wildcard is used to generate a list of reSt source files # (whatever/thing.txt). # # That fragment could have an associated metadata file (whatever/thing.meta), # and optionally translated files (example for Spanish, with code "es"): # whatever/thing.es.txt and whatever/thing.es.meta # # This assumes you use the default TRANSLATIONS_PATTERN. # # From those files, a set of HTML fragment files will be generated: # cache/whatever/thing.html (and maybe cache/whatever/thing.html.es) # # These files are combined with the template to produce rendered # pages, which will be placed at # output / TRANSLATIONS[lang] / destination / pagename.html # # where "pagename" is the "slug" specified in the metadata file. # # The difference between POSTS and PAGES is that POSTS are added # to feeds and are considered part of a blog, while PAGES are # just independent HTML pages. # POSTS = ( ("posts/*.txt", "posts", "post.tmpl"), ("posts/*.rst", "posts", "post.tmpl"), ) PAGES = ( ("stories/*.txt", "stories", "story.tmpl"), ("stories/*.rst", "stories", "story.tmpl"), )
要写Markdown的话,需要各加一行变成这样:
POSTS = ( ("posts/*.txt", "posts", "post.tmpl"), ("posts/*.rst", "posts", "post.tmpl"), ("posts/*.mdown", "posts", "post.tmpl"), ) PAGES = ( ("stories/*.txt", "stories", "story.tmpl"), ("stories/*.rst", "stories", "story.tmpl"), ("stories/*.mdown", "stories", "story.tmpl"), )
-
TEASERS 为了在首页INDEX和RSS订阅中只显示截取部分的文章预览,需要把
INDEX_TEASERS
和RSS_TEASER
注释去掉,并且把值都设置为True;这样在*.mdown文档中插入<!-- TEASER_END -->
后,其下方的文章就会被自动折叠。 -
Theme Installation Nikola社群的主题不算很多,但是基本够用,而且都偏向大方干净。我现在使用的是Zen系列。因为不同的博客需要做不同的配置修改(一般都很容易),还是自行去官方主页去挑选比较靠谱,一般都需要修改一下导航栏即NAVIGATION_LINKS。
或许还会继续补充……