使用 Python 在 GitHub 上執行你的部落格

2020-04-02 10:10:00

使用 Pelican 建立部落格,這是一個基於 Python 的平台,與 GitHub 配合的不錯。

GitHub 是一個非常流行的用於原始碼控制的 Web 服務,它使用 Git 同步本地檔案和 GitHub 伺服器上保留的副本,這樣你就可以輕鬆地共用和備份你的工作。

除了為程式碼倉庫提供使用者介面之外,GitHub 還運允許使用者直接從倉庫發布網頁。GitHub 推薦的網站生成軟體包是 Jekll,是使用 Ruby 編寫的。因為我是 Python 的忠實粉絲,所以我更喜歡 Pelican,這是一個基於 Python 的部落格平台,可與 GitHub 很好地協同工作。

Pelican 和 Jekll 都可以將 MarkdownreStructuredText 中編寫的內容轉換為 HTML 以生成靜態網站,並且兩個生成器都支援客製化的主題。

在本文中,我將介紹如何安裝 Pelican、設定 GitHub 倉庫、執行快速入門幫助、編寫一些 Markdown 檔案以及發布第一篇部落格。我假設你有一個 GitHub 賬戶,熟悉基礎的 Git 命令,並且想使用 Pelican 發布部落格。

安裝 Pelican 並建立倉庫

首先,你必須在本地計算機上安裝 Pelican 和 ghp-import。使用 Python 軟體包安裝工具 pip(你有,對吧?),這非常容易:

$ pip install pelican ghp-import Markdown

然後,開啟瀏覽器並在 GitHub 上為你新鮮出爐的部落格建立一個新倉庫,命名如下(在此處以及整個教學中,用 GitHub 使用者名稱替換 username):

https://GitHub.com/username/username.github.io

讓它保持為空,稍後我們用引人注目的部落格內容來填充它。

使用命令列(確保正確),將這個空 Git 倉庫克隆到本地計算機:

$ git clone <https://GitHub.com/username/username.github.io> blog$ cd blog

奇怪的把戲…

在 GitHub 上發布 Web 內容有一個不太引入注意的技巧,對於託管在名為 username.github.io 的倉庫的使用者頁面,其內容由 master 分支提供服務。

我強烈建議所有的 Pelican 組態檔和原始的 Markdown 檔案都不要保留在 master 中,master 中只保留 Web 內容。因此,我將 Pelican 設定和原始內容保留在一個我喜歡稱為 content 的單獨分支中。(你可以隨意建立一個分支,但以下內容沿用 content。)我喜歡這種結構,因為我可以放棄掉 master 中的所有檔案,然後用 content 分支重新填充它。

$ git checkout -b contentSwitched to a new branch 'content'

設定 Pelican

現在該進行內容設定了。Pelican 提供了一個很棒的初始化工具 pelican-quickstart,它會詢問你有關部落格的一系列問題。

$ pelican-quickstartWelcome to pelican-quickstart v3.7.1.This script will help you create a new Pelican-based website.Please answer the following questions so this script can generate the filesneeded by Pelican.> Where do you want to create your new web site? [.]  > What will be the title of this web site? Super blog> Who will be the author of this web site? username> What will be the default language of this web site? [en]> Do you want to specify a URL prefix? e.g., http://example.com   (Y/n) n> Do you want to enable article pagination? (Y/n)> How many articles per page do you want? [10]> What is your time zone? [Europe/Paris] US/Central> Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n) y> Do you want an auto-reload & simpleHTTP script to assist with theme and site development? (Y/n) y> Do you want to upload your website using FTP? (y/N) n> Do you want to upload your website using SSH? (y/N) n> Do you want to upload your website using Dropbox? (y/N) n> Do you want to upload your website using S3? (y/N) n> Do you want to upload your website using Rackspace Cloud Files? (y/N) n> Do you want to upload your website using GitHub Pages? (y/N) y> Is this your personal page (username.github.io)? (y/N) yDone. Your new project is available at /Users/username/blog

你可以對每個問題都採用預設值,但除了以下這些問題:

  • 網站標題,應該唯一且特殊
  • 網站作者,可以是個人使用者名稱或你的全名
  • 時區,可能你不在巴黎
  • 上傳到 GitHub 頁面,我們選擇 y

回答完所有問題後,Pelican 會在當前目錄中留下以下內容:

$ lsMakefile      content/     develop_server.sh*fabfile.py    output/      pelicanconf.pypublishconf.py

你可以檢視 Pelican 文件來了解如何使用這些檔案,但現在我們要做的是完成手頭的工作。說實話,我也沒有閱讀文件。

繼續

將所有 Pelican 生成的檔案新增到本地 Git 倉庫的 content 分支,提交更改,然後將本地更改推播到 Github 上托管的遠端倉庫:

$ git add .$ git commit -m 'initial pelican commit to content'$ git push origin content

這件事情並不是特別令人興奮,但是如果我們需要復原這些檔案之一的修改時,這將非常方便。

終於

終於,現在你得到一個部落格了!你所有的部落格文章、照片、影象、PDF 等都將位於 content 目錄中,它最初是空的。要開始建立第一篇部落格和關於頁面,輸入:

$ cd content$ mkdir pages images$ cp /Users/username/SecretStash/HotPhotoOfMe.jpg images$ touch first-post.md$ touch pages/about.md

接下來,在你喜歡的文字編輯器中開啟 first-post.md,並新增以下內容:

title: First Post on My Sweet New Blogdate: <today's date>author: Your Name Here# I am On My Way To Internet Fame and Fortune!This is my first post on my new blog. While not super informative itshould convey my sense of excitement and eagerness to engage with you,the reader!

前三行是 Pelican 用於組織內容的後設資料。有很多不同的後設資料可供你選擇。再說一次,文件是你了解更多選項的最佳選擇。

現在,開啟空白檔案 pages/about.md 並新增以下文字:

title: Aboutdate: <today's date>![So Schmexy][my_sweet_photo]Hi, I am <username> and I wrote this epic collection of Interwebwisdom. In days of yore, much of this would have been deemed sorceryand I would probably have been burned at the stake.