Rails4のdigestにまつわる論争

### 起きている問題
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を吐き出せるようなオプションがあれば問題が解決する！という問題が[長々と議論](https://github.com/rails/sprockets-rails/issues/49)されましたが、最終的には"これは仕様なんだから自分で解決してよ！“と言う事で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](https://github.com/rafaelfranca)さんが言っているのでそうなのでしょう。

cf.[config.assets.digest = false doesn't work #11403](https://github.com/rails/rails/issues/11403)

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

cf.[config.assets.compile=true in Rails production, why not?](http://stackoverflow.com/questions/8821864/config-assets-compile-true-in-rails-production-why-not)

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

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

> This is not an issue. This is by design.

[rafaelfranca](https://github.com/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")の書き方は動かない話](http://qiita.com/wadako111/items/03bc00d914e62243a511)

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

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

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

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

[議論](https://github.com/rails/sprockets-rails/issues/49)ではこの方法がおすすめされてます。

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

### 解決策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の長々とした論争](https://github.com/rails/sprockets-rails/issues/49)では、以下のようなコメントが。。


> 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