Sass v3.4.0.rc.1とgrunt-contrib-sass

Sass v3.4.0.rc.1が出た。&の扱いが拡充したこととセレクターを扱う関数の追加がトピック。他に予告されていた変数スコープの改善も思ったよりも早く導入された。後方互換性を失う変更はあるものの、大体は問題なくコンパイルされる。けどコンパイラーのオプション他に変化があったため、それらをラップするツールで不具合が起こりやすい。例えばgrunt-contrib-sass--load-path--sourcemapオプション辺りの変更に対応できておらず、例外を吐いて落ちたりする。

NoMethodErrorへの対策

普通に実行する場合は問題ないが、--load-pathオプション付きで実行しようとすると以下の様にSassコンパイラーがNoMethodErrorで落ち、タスクが止まってしまうことがある。

Running "sass:main" (sass) task
NoMethodError: undefined method `<<' for nil:NilClass
  Use --trace for backtrace.
Warning: Exited with error code 1 Use --force to continue.NoMethodError:

Aborted due to warnings.

これはv3.4.0.rc.1でライブラリをロードするパスとして入力ファイルと同じディレクトリが含まれなくなったことに起因する問題のようだ。grunt-contrib-sass経由の場合、--load-pathが常に指定されて実行されるので起こりやすい。CHANGELOGで触れられているようにSASS_PATHという環境変数を設定しておくと落ちなくなる。

$ export SASS_PATH=.

Bashの場合はexportで、Windowsでコマンド・プロンプトならsetを使う。.bashrcなどには書かずにGruntを実行するターミナルなどで設定するのが良さそう。環境変数の有無が問題なような感じなので、.じゃなくても良さそう。

Source Mapへの対応

Sass v3.4.0.rc.1ではSource Mapがデフォルトで出力されるようになり、それに伴ってオプションも変更になった。

--sourcemap=TYPE             How link generated output to the source files.
                               auto (default): relative paths where possible, file URIs elsewhere
                               file: always absolute file URIs
                               inline: include the source text in the sourcemap
                               none: no sourcemaps

今までのような真偽値のオプションではなくなり、文字列でSource Mapの出力方法を指定するように変わっている。また他の--style--default-encodingと違って、このオプションのみ=で値を指定する必要がある。grunt-contrib-sassではこの新しい値の文字列に対応していないのみならず、内部で利用しているdargsパッケージ=で値を指定する方法に対応していないので、結構大胆に手をいれる必要があった。

おおまかにv3.3.xにも対応したつもりだけど、オプションを省略した時の挙動がSassのバージョンによって変わる(ためにテストが通らない)。もっとうまく書けそうだったらプルリクエストを送るつもりだけど、テストの修正なしにはちょっと難しそう。


とりあえず手元の環境ではちゃんと動くようにできたので、今のところはまぁ良いかという感じ。--sourcemap=autoとかへの対応はSass側で修正されそうな気がするので、焦ってプルリクエスト送らない方が良さそうとも思ってる。

追記

grunt-contrib-sassのv0.8.0がリリースされ、Sass v3.4.0がサポートされた。上記の問題は解決したが、代わりにv3.3.14以下でSource Mapを出力することはできなくなったことには注意が必要。