起きている問題
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されたりしています。
-
Inability to compile nondigest and digest assets breaks compatibility with bad gems #49
https://github.com/rails/sprockets-rails/issues/49 -
Cant disable asset digests #10810
https://github.com/rails/rails/issues/10810 -
rake assets:precompile completely ignores asset pipeline configuration #10721
https://github.com/rails/rails/issues/10721 -
config.assets.digest = false #11482
https://github.com/rails/rails/issues/11482
結論から言うと、この問題に関しては自分で解決しなければならないようです。また、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
結論
- 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