Compass1.0.1をRails4で使おうとして依存解決の罠にいろいろハマった

compass, rails

環境

  • Rails 4.1.4
  • Compass 1.0.1

Compassとは

世の中にはCompassという便利なsass/scssライブラリがあります。

これは何なのかというと、cssを書くときに面倒なvendor prefixやお決まりのパターンをmixin等sass/scssの機能を使って簡単に書けるようにしたもの、というのが僕の理解です。

非常に便利なのでrailsを使うときにはbootstrap, font-awesomeと並んで大体最初から入れているものです(でした)。

今回はflex-boxを使いたくてCompass1.0.1を使おうとしたけれど依存の関係でそう簡単ではない、という話です。

Compass with Rails

CompassをRailsで使用する際にはcompass-railsを使います。これはCompassをRailsで使用するためのgemですが、簡単にはいきませんでした。

バージョン指定無し

通常のgemと同様に

Gemfile
1
2
gem 'sass-rails'
gem 'compass-rails'

とGemfileに書いて

1
bundle

でインストールできます。

この際何が問題になるかというと、インストールされるcompassのバージョンが以下の形で解決されてしまうことです。

Gemfile.lock
1
2
3
4
5
6
7
compass-rails (2.0.0)
  compass (>= 0.12.2)
compass (0.12.7)
  sass (~> 3.2.19)
sass-rails (4.0.3)
  sass (~> 3.2.0)
sass (3.2.19)

最終的にはsassのバージョンが問題(古い)となってcompassが0.12.7までしか入りません。

バージョン指定 sass-rails

問題となるgemはsassでそのバージョンを限定しているのはsass-railsです。

そこでsass-railsのバージョンを上げる方向で解決を測りました。

sass-railsのバージョンは現在5.0.0beta1(!)がリリースされているのでそれで試してみます。

Gemfile
1
2
gem 'sass-rails', '5.0.0beta1'
gem 'compass-rails'

Gemfileを↑に書き換えて再度bundle。すると以下のエラーを得ます。

1
2
3
4
5
6
7
Bundler could not find compatible versions for gem "sprockets":
  In snapshot (Gemfile.lock):
    sprockets (2.11.0)

  In Gemfile:
    sass-rails (= 5.0.0beta1) ruby depends on
      sprockets (~> 2.12) ruby

Gemfile.lockを見ると、 sprocketsが2.11.0で解決されていることが原因のようです。ならばとsprocketsをupdateします。

1
bundle update sprockets

これで全ての依存が解決しましたが、Gemfile.lockを覗いてみると肝心のcompassが古いままです。compass-railsも大雑把に指定してくれているのでcompass-railsごとバージョンをあげます。

1
bundle update compass-rails

すると

Gemfile.lock
1
2
3
4
5
6
7
8
9
10
11
12
13
14
compass (1.0.1)                       <- '!!!!'
  chunky_png (~> 1.2)
  compass-core (~> 1.0.1)
  compass-import-once (~> 1.0.5)
  rb-fsevent (>= 0.9.3)
  rb-inotify (>= 0.9)
  sass (>= 3.3.13, < 3.5)
compass-core (1.0.1)
  multi_json (~> 1.0)
  sass (>= 3.3.0, < 3.5)
compass-import-once (1.0.5)
  sass (>= 3.2, < 3.5)
compass-rails (2.0.1)
  compass (~> 1.0.0)

来ました! 目的のcompass1.0.1ですね!

sass-railsがbeta1なのが気がかりですが、今のところ動作に問題ないように思います。

今回は比較的小規模なプロジェクトだったのでそこまで大変ではありませんでしたが、大きなプロジェクトではさらに依存解決が大変そうですね。

まとめ

Gemfile
1
2
gem 'sass-rails', '5.0.0beta1'
gem 'compass-rails', '2.0.1'
1
bundle update sprockets

おまけ

そもそもなぜsass3.3にcompassが依存しているのか、という話です。

この分野には疎いのですが、どうやらsassは今でもバージョンアップがあるらしく、そのなかで3.3で連想配列等の新しい記法が幾つか追加されました。

compassはその追加記法を使用しているため、sass3.3に依存している、という内部構造のようです。

sassは僕が思っていたよりもよほど構造化できる文法を持っているようですねー

追記(2014-10-17)

compassを使用するためにrails-assetsを使う方法もあります。

インストールするには以下の様にGemfileに追加します。使用するためにはsourceも追加する必要があります。

1
2
3
source 'https://rails-assets.org

gem 'rails-assets-compass-mixins'

おそらく依存解決はできるんじゃないでしょうか。

しかし手元ではなんちゃらがincludeできない、みたいなエラーに遭遇しました。

どうやらこれもsassのバージョンが古いことが原因のようです。

ということでcompass-railsと同様にsass-railsを5.0.0beta1に上げると解決します。

どちらにしても今現在ではsass-rails-5.0.0beta1は必要っぽいですね。

Comments