rcmdnk's blog
Last update

Tiny Tentacles Octopus Infant / Toddler Costume 小さな触手タコ乳児/幼児コスチューム サイズ:18 Months-2T

この前作ったOctopressのgenerate_only と言うタスクをもう少し便利に変更。

Sponsored Links

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_onlygeneratの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時に確認する様に。

以下の様に、generateisolateintegratedeployのタスクで、 .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_onlyprevew_onlyで確認して、 deployする時も忘れずに、現在published担ってる記事の全記事を 静止してから送るようになります。

おまけ: 短縮コマンド

generategenerate_onlygengen_onlyでも呼べるように。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#desc "Same as generate"
#task :gen do
##  Rake::Task[:generate].execute
#end

desc "Same as generate"
task :gen => :generate

desc "Same as generate_only"
task :gen_only, :filename do |t, args|
  if args.filename
    filename = args.filename
  else
    filename = get_stdin("Enter a post file name: ")
  end
  Rake::Task[:generate_only].invoke(filename)
end

追記: 2014/12/07

単にタスクの名前を置き換えたいだけなら一行で上の様に書けるのでその部分を追加。

追記ここまで

追記: 2013/12/23

もうちょっと便利化:

Octopressのgenerate_onlyをモット便利に2

追記ここまで

Sponsored Links
Sponsored Links

« Cygwinのインストール方法 (Windows再インストール) Bashでの数の取り扱いについて »