github pagesでもjekyllのプラグインを使いたい
github pagesはプラグイン使えないので、プラグイン使いたい場合はローカルでコンパイルして静的ファイルをpushする必要があるんだけど、その場合ソースファイルの管理どうすればいいんだってのが問題になる。
URLを
http://<username>.github.com/<reponame>/_site/
とかにすれば話は単純だけど、できれば
http://<username>.github.com/<reponame>/
でやりたい。github pagesでDocument Root的な設定が可能ならそれで済む話なんだけど、できないのでどうにか頑張るしかない。
で、Octopressってプラグイン使ってgithub pagesにデプロイできるけどどうしてんだろと思って調べてみた。Octopressは
$ rake deploy
ってやるとデプロイできるようになってる、んでこのdeployってタスクは何をしてるかというと、
desc "deploy public directory to github pages" multitask :push do puts "## Deploying branch to Github Pages " (Dir["#{deploy_dir}/*"]).each { |f| rm_rf(f) } Rake::Task[:copydot].invoke(public_dir, deploy_dir) puts "\n## copying #{public_dir} to #{deploy_dir}" cp_r "#{public_dir}/.", deploy_dir cd "#{deploy_dir}" do system "git add ." system "git add -u" puts "\n## Commiting: Site updated at #{Time.now.utc}" message = "Site updated at #{Time.now.utc}" system "git commit -m \"#{message}\"" puts "\n## Pushing generated #{deploy_dir} website" system "git push origin #{deploy_branch} --force" puts "\n## Github Pages deploy complete" end end
こんな感じ。_deployというディレクトリにgh-pagesブランチをチェックアウトしておき、jekyllで出力したファイルを_deployディレクトリにコピーし、git pushまでやる。_deployディレクトリは完全にgithub pagesのデプロイ用ディレクトリで、ソースはその上にあるので、gitのディレクトリが二段階になるようになる。
. ├── .git # ソースファイルのリポジトリ ├── _config.yml # 他にもこの階層にファイルいっぱい ├── Rakefile # ├── _deploy # │ └── .git # gh-pagesのリポジトリ └── public # jekyllの出力先。こいつから_deployにコピーされる
つまりソース用のブランチとデプロイ用のブランチを分け、ソース用のブランチでdeployタスクを実行するとデプロイブランチにファイルをコピってpushしてくれるってこと。やや強引だけどこれ以外にあんまりいい方法も思いつかないので真似してみた。
https://github.com/pxgrid/js-flipsnap/tree/gh-pages-src
https://github.com/pxgrid/js-flipsnap/tree/gh-pages
上がソースのブランチで下がデプロイ用のブランチ。OctopressのRakefileは色々やりまくってて超長いので参考にしつつ必要そうなので書いてる。
https://github.com/pxgrid/js-flipsnap/blob/gh-pages-src/Rakefile