My personal website has been full of weeds since I did not update it for a really long time. As I am trying to put together a package to apply for jobs, I finally get some time to update my website. The previous version of my website was build with Jekyll. However, it is a bit slow and whenever I want to creat a new post, I need to type the yaml head. (Yes, you can set up a snippet, but…). Finally, Yihui wrote an awesome R package blogdown to creat personal website with Hugo and Rstudio, which makes it so much easier to update your website and to publish new blog posts. Here is a post to briefly record how I have done it. When it is not clear, the best way is to look at source code here or here.
Install Hugo and create your site
First, go to the blogdown webpage and install it. For Mac users, you may need to install homebrew first, which you definitely should.
devtools::install_github('rstudio/blogdown')
blogdown::new_site()
Then go to the new website folder, make it to be a git repository with git init. You should also make a .gitignore file.
Yihui’s modified hugo-lithium-theme is simple and good, thus I decide to use it. You can install it with
blogdown::install_theme('yihui/hugo-lithium-theme')
I did not install it this way, instead, I used
git submodule add git@github.com:yihui/hugo-lithium-theme.git themes/hugo-lithium-theme
This will clone the theme into your themes folder locally but won’t copy it when you push it into github (because of the .gitmodules file created).
Tweak your website
Now you can put your old posts and webpages into the content folder. If you are familiar with CSS and html, then it should be straightforward.
config.yamlis the first file to change and it is self-explaining;- logo picture should go into
static/images/logo.png; - CNAME file also into
static, then Hugo will copy it intopublicfolder, which is the generated website at the end;- anything within
staticfolder will be copied topublicas is: i.e.static/images/fig1.jpgwill be copied aspublic/images/fig1.jpg.
- anything within
- tweak files in
layoutfolder, e.g.partials/footer.htmlto change footers of your website; - if you want to close comments on some pages, put
disable_comments: truein the yaml head. - because my previous posts have slightly different syntax, I need to update them one by one using some R code.
- If you use Rstudio addins to creat a new post, set
options(blogdown.subdir = "content")first, so then if you select subdirectory asenand title astitle, then Rstudio will create the file ascontent/en/date-title.md, otherwise, it will create ascontent/post/en/date-title.md.- Now, you can just open Rstudio and start to write your blogs!
Publish your website
Approach 1: Push website into Github
Now, you need to create two repositories at Github: one to host the hugo folder and one to host the generated website (i.e. the public folder). Suppose you have two repositories now: username.github.io (to host generated website) and website (to host hugo code). Within your website folder:
rm -rf public # do not worry
git remote add origin https://github.com/username/website.git
git submodule add -f https://github.com/username/username.github.io.git public
# push website source code to github
git commit -am "Initial commit"
git push -u origin master
Now, you can generate the website again, either use Rstudio or terminal.
hugo
cd public
git add .
git commit -m "Build website"
git push -u origin master
Approach 2: Use Netlify
The free plan of netlify can meet all my requirements: build my website from the source, https, and custom domain. So I have deployed my website there. The good thing is that I do not need to push the public folder to github anymore. Whenever I change the source code of my website, netlify will automatically rebuild my website for me! How cool it that?
Issues
Here are some issues I still have:
- I used to have my Chinese and English blogs separated; and I have two short names for Disqus comments for them. Now I have merged these two blogs into one folder, but I cannot merge their comments too. I can only choose one shortname. Any solutions?
In this setup (submodule forpublicfolder), whenever I rebuild the site, almost all webpages in thepublicfolder changed and need to commit and push to github?? Why?- It turns out that Hugo will rebuild webpages that have been changed (e.g. lists of blog posts) but not all of them. So, this is not an issue anymore.
- to be updated.