この前作ったOctopressのgenerate_only と言うタスクをもう少し便利に変更。
published: false
なファイルをgenerateする- generate_onlyに
OCTOPRESS_ENV
を追加 - isolateコマンドでディレクトリも移動する
- isolateした後にdeployするときに再コンパイルするのを忘れない様に
- おまけ: 短縮コマンド
published: false
なファイルをgenerateする
Octopressではyamlブロックに
published:false
等と書いておけばrake generate
した際に無視されます。
ただ、rake preveiw
等をした時は表示されます。
Rakefileのpreview
のタスクを見ると
jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll --auto")
こんな感じで、jekyllを実行する際にOCTOPRESS_ENV
という変数にpreview
という値を入れてから実行するとpublished
の値を無視するようになるみたいです。
generate_onlyにOCTOPRESS_ENV
を追加
ということで、generate_only
のgenerat
のtaskを置き換えます。
# usage rake generate_only[my-post]
desc "Generate only the specified post (much faster)"
task :generate_only, :filename do |t, args|
+ raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
if args.filename
filename = args.filename
else
- Rake::Task[:generate].execute
+ puts "## Generating Site with Jekyll"
+ system "compass compile --css-dir #{source_dir}/stylesheets"
+ system({"OCTOPRESS_ENV"=>"preview"},"jekyll")
generate
のタスクを変更するのはあれなので、
直接実行行を持ってきて、一応最初にinstallのチェックも加えておきました。
これで、まだ公開したくない記事をgenerate_only
でちょっと確認したい時でも、
わざわざpublished
の値を変更せずに済みます。
isolateコマンドでディレクトリも移動する
デフォルトのisolate
コマンドだと_post
にディレクトリがあった場合は無視されます。
(と言うか、*.*
と言った拡張子が付いたような形になってるものだけが移動される。
なので、ディレクトリも.
を入れておけば移動されます。)
Octopressではディレクトリ構造があろうがなかろうが、
_post
ディレクトリ以下のファイルは同等に扱われてgenerate
時に使われます。
数が増えてきたので、取り敢えず年ごとくらいには最低分けたりしようかと思い始めて、
その際にisolate
しても除かれなかったので、isolate
のタスクを以下のように変更。
desc "Move all other posts than the one currently being worked on to a temporary stash location (stash) so regenerating the site happens much more quickly."
task :isolate, :filename do |t, args|
FileUtils.mkdir(full_stash_dir) unless File.exist?(full_stash_dir)
- Dir.glob("#{source_dir}/#{posts_dir}/*.*") do |post|
+ Dir.glob("#{source_dir}/#{posts_dir}/*") do |post|
FileUtils.mv post, full_stash_dir unless post.include?(args.filename)
end
end
単に対象を*.*
から*
に変えただけです。
これだと_post
以下にディレクトリがあると、その中の物はisolate
出来ません。
(ディレクトリごと持ってかれるので)
この辺までrecursiveにやっても良いかもしれませんが、
適当にやるとファイルを消してしまうかもしれないので
面倒なので取り敢えずこれだけ。
通常、最新ファイルは_post
で作成し、
過去のファイルでも必要であれば一時的に_post
以下に持ってきてから
only
タスクで試すようにします。
ちなみに、_post
以下で使われるファイル名について、ですが、
markdown形式のファイルであっても、ファイル名が2013-01-01-test.md
の様に
yyyy-mm-dd-
から始まってないと無視される?様です。年月だけでもだめ。
逆に言うと、自分用のメモとかmemo.md
とかを書いておいて_post
下に置いておく事も可能です。
(generate時に無視される)
また、この日付が正しくないと(2013-13-31...
とか)文句を言われます。
ERROR: YOUR SITE COULD NOT BE BUILT:
------------------------------------
Post 2013-13-31-test.md does not have a valid date.
ただ、ここで注意が必要なのは、ここで日付をチェックしているにも関わらず、
通常、ブログに表示される日時や、パーマネントリンクに使われる日付はyamlブロックのdate
の値です。
なので、その両者がずれると結構面倒。
date
の値がない場合にはファイル名から日付やリンクが決まります。
ちなみにdate
の方が正しくない日付だと
.../ruby/2.0.0/time.rb:264:in `local': argument out of range (ArgumentError)
こんな感じのエラーが出ます。
isolateした後にdeployするときに再コンパイルするのを忘れない様に
テスト用にisolate
してからpublic
を作り替えたりして、ふと
deploy
してしまうと1記事だけのブログになってしまいます。
たまにそのまま暫く気付かなかったり。。。
ということを避けるために、deploy時に確認する様に。
以下の様に、generate
、isolate
、integrate
、deploy
のタスクで、
.isolated
及び.integrated
という一時ファイルを作ってそれぞれの状態を
確認するようにします。
(今回初めて確認しましたが、previewの時も下で見れるように.preview-mode
と言うファイルを使って
previewしたままの場合は改めてgenerateするようになっていました。)
desc "Generate jekyll site"
task :generate do
raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
puts "## Generating Site with Jekyll"
system "compass compile --css-dir #{source_dir}/stylesheets"
system "jekyll"
+ system "rm -f .integrated"
end
desc "Move all other posts than the one currently being worked on to a temporary stash location (stash) so regenerating the site happens much more quickly."
task :isolate, :filename do |t, args|
FileUtils.mkdir(full_stash_dir) unless File.exist?(full_stash_dir)
- Dir.glob("#{source_dir}/#{posts_dir}/*.*") do |post|
+ Dir.glob("#{source_dir}/#{posts_dir}/*") do |post|
FileUtils.mv post, full_stash_dir unless post.include?(args.filename)
end
+ system "touch .isolated"
end
desc "Move all stashed posts back into the posts directory, ready for site generation."
task :integrate do
- FileUtils.mv Dir.glob("#{full_stash_dir}/*.*"), "#{source_dir}/#{posts_dir}/"
+ FileUtils.mv Dir.glob("#{full_stash_dir}/*"), "#{source_dir}/#{posts_dir}/"
+ system "rm -f .isolated"
+ system "touch .integrated"
end
desc "Default deploy task"
task :deploy do
# Check if preview posts exist, which should not be published
if File.exists?(".preview-mode")
puts "## Found posts in preview mode, regenerating files ..."
File.delete(".preview-mode")
Rake::Task[:generate].execute
end
+ if File.exists?(".integrated") or File.exists?(".isolated")
+ puts "## Found isolated history, regenerating files ..."
+ system "rm -f .integrated .isolated"
+ Rake::Task[:integrate].execute
+ Rake::Task[:generate].execute
+ end
これで、普段からrake gen_only
やprevew_only
で確認して、
deploy
する時も忘れずに、現在published
担ってる記事の全記事を
静止してから送るようになります。
おまけ: 短縮コマンド
generate
とgenerate_only
をgen
、gen_only
でも呼べるように。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
追記: 2014/12/07
単にタスクの名前を置き換えたいだけなら一行で上の様に書けるのでその部分を追加。
追記ここまで