PHP製の静的サイトジェネレーター「Sculpin」の紹介と使い方の解説
本記事では、PHP製の静的サイトジェネレーター(Static Site Generator)の 「Sculpin」について解説をしていく。
公式サイト:Sculpin — PHP Static Site Generator
Sculpinの特徴とは
Sculpinとは、PHP製の静的サイトジェネレーターであり、 主にSymfony製のライブラリによって作られた静的サイトジェネレーターである。
静的サイトジェネレーターはPHP以外にも様々な言語で実装されており、特に以下の静的サイトジェネレーターが人気を得ている。
- Go製のHugo
- JavaScript製のNext.js Gatsby
- Ruby製のJekyll
「Static Site Generators - Top Open Source SSGs | Jamstack」のページでも詳しく紹介されているが、2022年2月時点で静的サイトジェネレーターは333つ存在している。
そんな中、HugoやJekyllにインスパイアされて登場したのが、我らがPHP製のSculpinと言うわけだ。
他の静的サイトジェネレーターと比較してのSculpinの優位性とは
正直に言うと、他の静的サイトジェネレーターと比較してSculpinの優位点はない。
そもそも、静的サイトジェネレーターは
- 1, markdownで記事を書いて、HTMLでテンプレートを作成
- 2, 1で作ったものを元に、主に文字列処理を行う
- 3, 最終的に完成したHTMLファイルを出力
と言う仕組みになっているので、FileIOや文字列処理が得意な言語ほど向いている傾向がある。
そこで並行処理が得意なGoが、静的サイトジェネレーターに向いている。
また、結局の所、静的サイトの主役はCSSやJavaScript等のフロントエンドなので、 フロントエンドとの親和性が高いJavaScript製の静的サイトジェネレーターが望ましい。
それにSculpinはJekyllやHugo等の超人気ジェネレーターと比較すると、テンプレートやライブラリが 少ないのも欠点となっている。
つまり、SculpinはPHPを愛し、PHPのためなら死ねるPHPer向けの静的サイトジェネレーターと言える。
2022年現在のSculpinのコミュニティの状況
2022年現在でもSculpinのコミュニティはそれなりに盛り上げを見せており、 継続的に開発は続けられている。
最新版は2021年6月にリリースされた3.1.1なので、今からSculpinを始めても遅くない。
「A discussion on the next steps for Sculpin · Issue #451 · sculpin/sculpin」のIssueでも 「これからSculpinをどうやって発展させていくか」の議論もされており、 個人的にはLiveEditor機能が実装されるのが楽しみ。
Sculpinの使い方
以下は、Sculpinでの静的サイトの作り方を解説していく。
Sculpinを動かす前に以下のものを事前に用意しておくこと。
- Composer
- Node.js
Sculpinでは、フロントエンドはsymfony/webpack-encore
と言うビルドツールを使って、
サーバーにデプロイするJavaScriptやCSSを生成する。
symfony/webpack-encore
は、設定ファイルが複雑になりやすいWebpackをシンプルに使うためのツールで、
Webpackのラッパーツールとなっている。
Sculpinで静的サイトを作る
Sculpinは静的サイトのひな形となるテンプレートをいくつか用意してくれている。
- sculpin/sculpin-blog-skeleton: A skeleton for a Sculpin based blog.
- sculpin/bootstrap-3-blog-theme: A Bootstrap 3 Blog Theme for Sculpin
- beryllium/sculpin-tailwind-blog-skeleton: A skeleton Sculpin Blog using Tailwind
今回は、最もオーソドックスなsculpin/sculpin-blog-skeletonを使って解説をしていく。
まずは以下のコマンドを実行すると、my-blogディレクトリにSculpinのひな形が作成される。
composer create-project -s dev sculpin/blog-skeleton my-blog
my-blogディレクトリ配下には、既にcomposer.json
やpackage.json
、webpack.config.js
が用意されているので、以下のコマンドを実行する。
cd my-blog
composer require
npm install
そして最後に、以下のコマンドを実行。
composer run sculpin-watch
これでhttp://localhost:8000
にアクセスをすると、ブログが生成されている。
Sculpinでは、開発環境はoutput_dev
、本番環境はoutput_prod
ディレクトリ配下に
静的ファイルが出力されるようになっている。
本番環境用の静的ページを生成したい場合は、以下のコマンドを実行すればよい。
vendor/bin/sculpin generate --env=prod
Sculpinをカスタマイズする
以下は、Sculpinのカスタマイズ方法を解説していく。
解説は先ほどのsculpin/sculpin-blog-skeleton
を使う事を前提に進めていく。
現在のトップディレクトリ配下には、以下のディレクトリがあるはずだ。
- app/config/
- source/
まずはsource/ディレクトリから解説する
source/ ディレクトリ
静的サイトを作る根幹となるディレクトリ。 基本的にsourceディレクトリ配下にあるファイル、ディレクトリは最終的に静的ページとして出力される。
例えば、source/about.md
のファイルを見てみよう。
---
layout: default
title: About
---
# About the Author or Blog
Here is a little information about the author or the blog.
---
で囲まれている部分はコンテンツのmeta情報で、---
以下がコンテンツの本文となる。
lauout: default
と書かれているが、これは「source/_layouts/default.htmlのテンプレートを元に静的ページを作成しますよ」
と指定している。
実際にsource/_layouts/default.html
を見てみると、テンプレートであることが分かる。
このdefault.html
に書かれている{{ page.title }}
にabout.mdの記事タイトル、
{% block content %}{% endblock %}
に記事本文が挿入されて、最終的にoutput_dev/about.html
の静的ページとして出力される。
source配下の特別なディレクトリ
先述した様に、source配下のファイル、ディレクトリは全て静的ページとして出力される。
しかし、以下のディレクトリは特別で、 主にabout.mdの様なMarkdownファイルや、後述するpaginationやcategory,tagページを生成するためのテンプレート の役割をする。
- _layouts
- _partials
- _views
- _includes
Sculpinは静的ページを作る際に、この4つのディレクトリの中から指定されたテンプレートを探す。
SculpinはテンプレートのパーサーとしてTwigを利用しているので、_layouts/default.html
の中で
{{ include("header") }}
の記述があると、4つのディレクトリの中から
header.html
を探してテンプレートに組み込んでくれる。
また、テンプレートの拡張子としてはhtmlだけでなく、'', 'twig', 'html', 'html.twig', 'twig.html'
が使える。つまり、default.html
をdefault.twig
に書き直しても同じように動く。
source/_postsディレクトリの役割
source/_posts
には、実際のブログ記事の元となるmarkdownファイルが入っている。
markdownファイルのファイル名は、sculpin.md
とすることで最終的にoutput_dev/sculpin/index.html
と
出力される。
ファイル名の先頭に2022-01-29-sculpin.md
と日付を入れることで、ブログ記事に日付情報を入れることができる。
(静的ページになる際にはoutput_dev/sculpin/index.html
で出力される。)
日付情報はdefault.html
等のテンプレートで{{ page.date|date("Y-m-d") }}
のように使う事ができる。
source/_posts
にあるmarkdownファイルは、source/_views/post.html
をテンプレートとして静的ページに生成される。
また、ブログ記事のURL等はapp/config/sculpin_kernel.yml
から変更ができる。
sculpin_content_types:
posts:
type: path
path: _projects
singular_name: project
layout: project
permalink: :year/:month/:day/:basename
taxonomies:
- categories
path
はブログ記事を入れているディレクトリを指定する。デフォルトでは、source/_posts
だが、source/_projects
に変更ができる。また、path
は複数指定できる。
singular_name
は、ブログ記事を静的ページに生成する際のテンプレートを指定する。デフォルトではpost.html
だが、
project.html
に変更できる。
permalink
は最終的に静的ページに生成される時のURLを決められる。上記の設定だと2022/01/29/sculpin/index.html
として
出力される。
詳細は公式ドキュメントに記載されている。
paginationを作る
Sculpinでは、標準機能によって簡単にpaginationが作れる。
source/index.html
を見ると、以下の様に書かれている。
---
layout: default
title: Home
generator: pagination
pagination:
max_per_page: 3
use:
- posts
---
テンプレートにgenerator: pagination
と書くことで、簡単にpaginationを作成できる。
また、max_per_page: 3
の数字を変更することで、1ページ毎の記事数を変更できる。
source/index.html
の場合だと、1ページはoutput_dev/index.html
、2ページ目以降は
output_dev/page/2/index.html
として出力される。
Categoryページを作成する
Categoryページを作成するのも簡単で、source/blog/categories/category.html
を見てみよう。
---
layout: default
title: Category Archive
generator: [posts_category_index, pagination]
pagination:
provider: page.category_posts
---
先ほどのindex.html
と違うのはgenerator: [posts_category_index, pagination]
と記述されていること。
posts_category_index
と指定して上げることで、category毎の記事を集めてくれる。
app/config配下の役割
app/config
配下のファイルは、以下の2種類のファイルが用意されている。
- sculpin_kernel.yml
- sculpin_site.yml
sculpin_kernel.yml
は先ほどのsource/_posts
の設定で行ったように、Sculpinの静的ページの作り方を
指定するための設定ファイルになる。
先ほどの例で言えば、ブログ記事を入れるディレクトリをsource/_projects
に変更したはずだ。
逆にsculpin_site.yml
は、テンプレート内で使う変数を設定するためのもの。
例えば、sculpin_site.yml
に以下の記載をしたとする。
title: Sculpin Blog Skeleton
subtitle: To Get You Started
すると、source/_layouts/default.html
やsource/_views/post.html
等の
テンプレート内で{{ site.title }}
と書くことができる。
また、sculpin_site_prod.yml
やsculpin_site_dev.yml
の様に環境ごとに設定ファイルを変更する事もできる。
参考になる記事、サイト
Sculpinを使う時に参考になる記事、サイトを上げていく。
- Documentation — Sculpin 公式ドキュメント。大体ここに知りたいことが載っている。
- sculpin/sculpin: 公式リポジトリ。ドキュメントを読んでも分からない場合はコードを読むしかない。
私も色々ネットを漁ったが、Sculpinについての情報は日本語・英語問わずほとんどない。 なので、基本的に「ドキュメント読め。分からん場合はコードを読め」となる。
もし、あなたが単に静的サイトで技術ブログを作りたい場合は、Sculpinではなく、HugoやJekyll等の コミュニティがより活発な静的サイトジェネレーターを使った方が幸せになれるだろう。
仮にあなたが「どうしてもPHPの静的サイトジェネレーターを使いたい」と言う狂信的なPHPerであれば、 Sculpinは良い遊び道具になってくれる。