はじめに
「みんな、ウタだよ!」、nikkieです。
今回はSphinxでビルドしたHTMLをGitHub Pagesで公開するときのtipsをアウトプットします。
sphinx.ext.githubpages
ってご存知でしたか?
目次
- はじめに
- 目次
- SphinxとGitHub Pagesを一緒に使うときの落とし穴
- GitHub PagesとJekyll
- Sphinxにおける対処法 sphinx.ext.githubpages
- CNAMEの対応もsphinx.ext.githubpagesでできるんです!
- 終わりに
SphinxとGitHub Pagesを一緒に使うときの落とし穴
reStructuredText(reST)やMarkdownで原稿を書き、ドキュメンテーションツールSphinxでHTMLをビルド、そして、そのHTMLはGitHub Pagesで公開できます!
私が初めて試したとき、1つ落とし穴にハマりました。
それは、「CSSが当たらない」「画像が見つからない」です。
Sphinxをデフォルト設定で使っていたので、ローカル環境ではbuild/html
ディレクトリ1の中の_static/css
にCSSが、_images
に画像が置かれました。
ところが、ビルドされたファイル(=build/html
の中身)一式をGitHub Pagesとして公開すると、CSSや画像にアクセスできません。
アンダースコアで始まるファイルやディレクトリにアクセスできないのです。
これはbuild/html
直下に.nojekyll
という空ファイルも合わせて置くことで解決します。
ではなぜこの方法で解決するのか、秘密を明かしてみましょう。
GitHub PagesとJekyll
GitHub Pagesのドキュメントの「Static site generators」を参照します。
If you publish your site from a source branch, GitHub Pages will use Jekyll to build your site by default.
If you want to use a static site generator other than Jekyll, we recommend that you write a GitHub Actions to build and publish your site instead.
Otherwise, disable the Jekyll build process by creating an empty file called.nojekyll
in the root of your publishing source, then follow your static site generator's instructions to build your site locally.
今回の説明に関係するところに絞って訳します(意訳気味です)。
- GitHub PagesはサイトをビルドするのにデフォルトでJekyllを使う(ref: 1文目後半)
- 公開しているソースのルートに
.nojekyll
と呼ばれる空のファイルを作ることで、Jekyllのビルドプロセスを無効にしてください。それから、あなたが使う静的サイトジェネレータがローカルでサイトをビルドするための説明書に従ってください(ref: 3文目)
.nojekyll
はJekyllによるサイトのビルドを無効にしているんですね!
また、こんな情報も見つかりました。
This should only be necessary if your site uses files or directories that start with underscores since Jekyll considers these to be special resources and does not copy them to the final site.
訳します:
あなたのサイトがアンダースコアで始まるファイルやディレクトリを使う場合のみ、これ(空ファイル.nojekyll
の作成)は必要となるはずです。
なぜならJekyllはそれら(アンダースコアで始まるファイルやディレクトリ)を特別なリソースとみなし、最終的なサイトにコピーしないからです。
アンダースコアで始まるディレクトリ(先の_static
や_images
)はデフォルトのJekyllによって最終的なサイトに入ってこないのですね。
だから.nojekyll
の配置が必要なんですね!
「要は毎回.nojekyll
を作ればいいだけでしょ」と思ったそこのあなた、実はSphinxは.nojekyll
作成をサポートしているんです!(バッテリーインクルード!)
Sphinxにおける対処法 sphinx.ext.githubpages
この拡張はGitHub Pagesで公開するために、
.nojekyll
ファイルをHTMLディレクトリ内に作成します。
sphinx.ext.githubpages
はSphinxをインストールしてさえいれば使えます。
使い方は、conf.py
のextensions
に書くだけです。
extensions = [
"sphinx.ext.githubpages",
]
これだけでビルドされたHTMLファイル群に.nojekyll
が含まれます🙌
簡単でしょ?
CNAMEの対応もsphinx.ext.githubpages
でできるんです!
GitHub Pagesはカスタムドメインで運用できます。
操作については以下のドキュメントが詳しいです(Configuring a subdomain)。
このGUI操作により、CNAME
というファイルがコミットされます2。
カスタムドメインのCNAME
ファイルもsphinx.ext.githubpages
でいい感じに扱えます!(上で紹介したsphinx.ext.githubpages
のドキュメントより)
また、
html_baseurl
セットの場合、カスタムドメイン用の CNAME ファイルを作成します。
html_baseurl
はconf.py
に設定できます3。
これを使った例が、Python Boot Campのページです。
#pyconjp スプリントにてGitHub Pagesのカスタムドメイン用のCNAMEをsphinx.ext.githubpagesでサクッと対応done
— nikkie にっきー 🎤10/1 XP祭り 10/14-15 PyCon JP (@ftnext) 2022年10月16日
数行の設定で済むなんて、Sphinxのこれまでの開発者の方々が素晴らしすぎます!👏
📣みなさま、Python Boot Campをよろしくお願いします!https://t.co/aw7yzSOIk3 https://t.co/VkzW0YibpO
Python Boot Campのページの例では、pushをトリガーにHTMLをビルドし、自作アクション4によりGitHub Pagesのブランチにforce pushしています。
GUIで作ったCNAME
はforce pushで消えることが懸念されましたが、sphinx.ext.githubpages
が毎回(.nojekyll
だけでなく)CNAME
も作ってくれるので、懸念は解消しました。
具体的な設定が知りたい方はソースリポジトリをどうぞ!
終わりに
SphinxでビルドしたHTMLをGitHub Pagesで公開するときに、CSSが当たらない・画像が見つからない事象を解決できるsphinx.ext.githubpages
を紹介しました。
GitHub PagesデフォルトのJekyllを無効化し、アンダースコアで始まるファイルやディレクトリもGitHub Pagesのサイトに含まれるようにしています。
touch .nojekyll
する方法は頻繁に見つかるのですが、実はSphinxはデフォルトの拡張機能としてサポートしているんです!
この解決方法は私にはエレガントに見えており、存在を知ってから愛用しています(Sphinxというツールを使いこなしてる気がしますよね、アガル!)。
おんなじように「いいな🤗」と思った方は、ぜひお手元のSphinxプロジェクトで試してみてください!
-
conf.py
の設定によっては_build/html
かもしれませんね。その場合は読み替えてください↩ - 「this will create a commit that adds a CNAME file to the root of your source branch.」↩
- https://www.sphinx-doc.org/ja/master/usage/configuration.html#confval-html_baseurl↩
-
sphinx-revealjsで作ったスライドをGitHub Pagesで公開する - nikkie-ftnextの日記で紹介した
ftnext/action-push-ghpages
です。 ↩