LoginSignup
38
34

More than 5 years have passed since last update.

Rails4のdigestにまつわる論争

Last updated at Posted at 2015-03-17

起きている問題

rails4からはassets:precompile時に、fingerprint付きのリソースしか出力しないようになりました。

Only compiles digest filenames. Static non-digest assets should simply live in public/.

cf.https://github.com/rails/sprockets-rails#changes-from-rails-3x

外部からリソースを参照する場合など、fingerprint無しでなければいけない状態の時にこれじゃ使えない!と言う問題と、config.assets.digestの設定が効かないよ!と言う、大きく2つの問題が起こっています。
どちらにしても、fingerprintありと無しの両方のassetsを吐き出せるようなオプションがあれば問題が解決する!という問題が長々と議論されましたが、最終的には"これは仕様なんだから自分で解決してよ!“と言う事でissueが次々とcloseされたりlockされたりしています。

結論から言うと、この問題に関しては自分で解決しなければならないようです。また、rails側は、"これは仕様であってそもそも問題ではない。気にくわなければ自分でハックしてね!"というスタンスなので、今後改修が入る事は無さそうです。

解決策1 : config.assets.compileをtrueにする

railsのドキュメンテーションには記載されていませんが、config.assets.compileがfalseになっているとconfig.assets.digest = falseが無効になるとあります。

digestにまつわる議論で度々発言をしているrailsのOWNERのrafaelfrancaさんが言っているのでそうなのでしょう。

cf.config.assets.digest = false doesn't work #11403

しかし、config.assets.compileをproduction環境でtrueにするとパフォーマンスに影響が出ます。

cf.config.assets.compile=true in Rails production, why not?

この解決策はproduction環境では使えないな、、と言うところです。

解決策2 : public以下に自分でファイルを設置する

This is not an issue. This is by design.

rafaelfrancaさんは、"これは仕様だからしょうがないでしょ!"と言っています。

config.assets.digest now only link to undigested files, but you need to generate these files on your own.

つまり、digestのオプションはfingerprint無しのリソースにリンクさせますが、ファイルは自分で作成しなければならないとの事。。

と言う事でpublic/assets以下に自分でファイルを設置すると言う方法があります。

cf.Rails4ではbackground:url("assets/hoge.png")の書き方は動かない話

が、それって二度手間じゃん!と言う率直な意見が多数見受けられます。そりゃそうだ、と言う事でこの解決策も微妙な感じですね。。

解決策3 : rakeタスクを作成する

出来ないなら自作だ!ということで、rakeタスクを作成する方法。

cf.https://github.com/rails/sprockets-rails/issues/49#issuecomment-20535134

議論ではこの方法がおすすめされてます。

ファイルを設置するだけなので簡単に導入が出来ます。

解決策4 : モンキーパッチをあてる

問題を解決してくれないなら自分で解決!と言う事で、モンキーパッチをあてる方法。

cf.https://gist.github.com/ryana/6049833

この方法も、rakeタスクの解決策と同様、オススメされてます。
rakeタスクにするかモンキーパッチをあてるかは好みの問題でしょうか。

解決策5 : gemを使う

non-stupid-digest-assetsと言う、もうやだよこのdigest問題の解決策となるgemがあるので、そちらを使うと言う方法。

In Rails 4, there is no way to by default compile both digest and non-digest assets. This is a pain in the arse for almost everyone developing a Rails 4 app. This gem solves the problem with the minimum possible effort.

cf.https://github.com/alexspeller/non-stupid-digest-assets

sprockets-railsの長々とした論争では、以下のようなコメントが。。

I know, it's just that the comments list is growing longer and longer and the best proposed "solution" is called non-stupid-digest-assets... It makes me smile :smile:

結論

  • fingerprint無しのリソースは、rails4からデフォルトでは生成する事が出来ない
  • config.assets.digestはnon-digestedファイルを生成するのではなく、リンクするだけ
  • Rails4のdigestに関する仕様変更で困った場合は、自分でハック!

Have a nice rails life!!


参考
https://github.com/rails/sprockets-rails#changes-from-rails-3x
https://github.com/rails/sprockets-rails/issues/49
https://github.com/rails/rails/issues/11403

38
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
34