animation load

Middlemanでハマったことと解決方法

今回は、middlemanサーバ起動時にはルート相対パスで動かし、ビルド時に(何かしらの理由で相対パスで書きだす必要があった場合を想定し)相対パスで書きだすという流れを試したくて四苦八苦していました。
2つほど大ハマりし、なんとか解決したのでメモとして残しておきます。
(きっと誰かの役に立つはず)

1. scssからmiddlemanの変数を使おうとしてエラー


症状
config.rb
set :css_dir, '/common/css'
set :js_dir, '/common/js'
set :images_dir, '/common/images'


scssファイル
body {
  background: image_url("logo.jpg");
}

上記のようにconfig.rbにパスの変数を持ち、scss側で image_url関数を使い画像のパスを指定。
すると以下の様なエラーがターミナルに
NameError: undefined local variable or method `sprockets_context' for...

解決方法
config.rb
set :css_dir, 'common/css'
set :js_dir, 'common/js'
set :images_dir, 'common/images'

パスの指定をスラッシュ始まりにするとエラーが出る模様。
そもそもルート相対パスか、相対パスかはconfig.rbの activate :relative_assets で指定できるので、変数にパスを持つときはスラッシュ始まりにしないほうがいい、たぶん。


2. ビルド時に相対パス指定をconfig.rbに入れたのにルート相対パスになる

config.rb
configure :build do
  # Use relative URLs
  activate :relative_assets
end

ビルド時に相対パスで書き出せと指定し、scssファイルでパス指定は image_url関数 を使用しているのに、なぜかcssファイルだけがルート相対パスになってしまっていた。
(middlemanの変数と、付随するimage_url関数を使えばパス周りの面倒はmiddlemanが見てくれるはずなので、config.rbの設定さえ変えれば全て自動でやってくれるはずと思い試してみたが…)


解決方法
以下の手順でビルドするといい(たぶん)

1 .cacheディレクトリ内のキャッシュファイルをすべて削除
2 過去にビルドを指定た場合は、buildディレクトリも削除
3 buildする

僕のケースはどうやらキャッシュ周りが原因でした。
キャッシュを空にし、過去のビルドも消してきれいな状態でビルドしたら治りました。


まとめ(的な)

上記2つの問題がクリアされ、無事「middleman sではルート相対パス、middleman buildでは相対パス」が実現できました。
(この問題解決のためにrubyのバージョン切り替えてみたり仮想環境で動かしてみたりと試行錯誤しましたが、問題は案外シンプルでした疲れました。)

それではまた

TAG