Por que Rails4 abandonou o suporte para o grupo de “ativos” no Gemfile

99

No Rails 3, as gemas usadas exclusivamente para gerar ativos no pipeline de ativos foram colocadas corretamente no assetsgrupo do Gemfile:

...

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
  gem 'uglifier'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby
end

Agora, de acordo com a documentação de atualização (ainda em andamento) :

O Rails 4.0 removeu o grupo de ativos do Gemfile. Você precisa remover essa linha do seu Gemfile ao atualizar.

Com certeza, fazer um novo projeto com RC1 produz um Gemfile com joias relacionadas a ativos incluídos por padrão fora de qualquer grupo:

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0.rc1'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0.rc1'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

...

Isso significa que essas joias serão agrupadas em compilações de produção por padrão? Se sim, por que a mudança no coração? O Rails 4 está se movendo em direção à geração dinâmica de ativos em produção?

jemmons
fonte
1
Ainda não entendi qual era o propósito do "grupo de ativos" e o que mudou no Rails 4 que tornou o grupo de ativos desnecessário.
Michiel de Mare
23
O "grupo de ativos" era coisas diferentes para pessoas diferentes. Usei-o como um local para colocar joias que eu não precisava empacotadas na produção. Mas, a julgar pela conversa ligada à resposta aceita, pelo menos algumas pessoas no núcleo do Rails o usaram como uma forma de garantir que os ativos não pré-compilados falhassem com um 404 em produção (em vez de autogeração silenciosa, o que levaria a problemas desempenho). O que mudou é que o rails4 não gera mais ativos automaticamente, então a solução alternativa "grupo de ativos" (como o viu o núcleo do rails) foi removida.
jemmons
Essa é a explicação mais clara ainda. Se você colocar em uma resposta, a recompensa é sua.
Michiel de Mare de
@MichieldeMare Eu me sentiria estranho recebendo uma recompensa pela minha própria pergunta ;-) Se você quiser, pode dar a recompensa a Filipe Giusti (a resposta aceita), pois ele foi fundamental para me ajudar a entender.
jemmons
3
Um aviso para as pessoas no futuro: Se você escolher ignorar o guia de atualização do Rails e manter o grupo de ativos em seu Gemfile, lembre-se de que o Rails não exigirá mais o grupo de ativos automaticamente ao compilar ativos em produção. Você precisará fazer isso sozinho ou adicionar RAILS_GROUPS=assets(consulte Rails.groups) antes do comando para pré-compilar ativos em produção em seu ambiente de construção.
Ajedi32

Respostas:

100

Anteriormente, o grupo de ativos existia para evitar a compilação sob demanda não intencional na produção. Como o Rails 4 não se comporta mais assim, fez sentido remover o grupo de ativos.

Isso é explicado com mais detalhes no commit que mudou isso. Extraí algumas citações com a resposta real.

Algumas joias podem ser necessárias (na produção), como barras de café, se você estiver usando modelos de café e o fato de que agora os ativos não são mais pré-compilados sob demanda na produção.

(não pré-compilado sob demanda na produção) Significa que se você tiver essas joias no ambiente de produção no 3.2.xe esquecer de pré-compilar, o Rails fará exatamente o que faz no desenvolvimento, pré-compilar os ativos que foram solicitados. Isso não é mais verdade no Rails 4, então se você não pré-compilar os ativos usando as tarefas, receberá um 404 quando os ativos forem solicitações.

Filipe Giusti
fonte
32
Não estava também economizando memória? Agora todas as gemas, mesmo aquelas não necessárias na "produção" (apenas na pré-compilação), são carregadas e, portanto, os trilhos consomem mais memória?
gucki
3
+1 @gucki e tempo de carregamento. Este foi o meu entendimento sobre os grupos .. Uma vez que já existia uma opção de configuração para desativar a compilação ao vivo de qualquer maneira. O que significa "suporte" aqui. afaik meu aplicativo Rails 3 tinha uma linha em env / prod.rb que carregava ativos apenas no desenvolvimento. Se isso for tudo, podemos apenas adicioná-lo mesmo assim?
Karthik T
O grupo de ativos é removido. Anteriormente, as gemas dentro dos ativos eram carregadas para a produção, agora e se também precisarmos delas na produção. Portanto, eles devem ser carregados na produção, a remoção do grupo de ativos garante isso. Os ativos devem ser pré-compilados antes de serem movidos para a produção.
prashantsahni de
13

O Rails 4 tenta forçá-lo a pré-compilar seus ativos antes da implantação. Você tem que pré-compilar seus ativos com

$ RAILS_ENV=production bundle exec rake assets:precompile

E porque? Eu encontrei isso no Guia:

Por padrão, o Rails assume que os ativos foram pré-compilados e serão servidos como ativos estáticos pelo seu servidor web.

(Fonte: http://edgeguides.rubyonrails.org/asset_pipeline.html#in-production )

Mas muitas vezes você tem que usar essas joias de 'ativos' na produção ... por exemplo, se você usar um arquivo js.coffee em seu diretório de visualizações, então o Rails precisa do compilador de café no modo de produção também.

Então eu acho que o motivo dessa mudança é a melhoria do desempenho ... e parece mais simples também. :)

Zoltan
fonte
22
Rails assumindo que os ativos foram pré-compilados é um argumento para manter o assetsgrupo, não se livrar dele (se os ativos forem pré-compilados, então essas joias não são necessárias na produção e não devem ser incluídas pelo bundler). E sim, talvez você usasse uma joia como coffee-railsna produção ... mas esse era o caso no Rails 3 também, certo? E o Rails 3 é colocado coffee-railsno assetsgrupo, por padrão. Então, por que a mudança para Rails 4?
jemmons
1
Por que você usaria um arquivo js.coffee em seu diretório de visualizações? Isso deve ir em assets / javascripts.
Marnen Laibow-Koser
3

Queremos coffeescript com AJAX ( histórico ), então coffee-railssai do grupo de ativos.
sass-railsse comporta mal ( histórico ), portanto, sai do grupo de ativos.

Axe o grupo de ativos.

mockturtl
fonte
2
CoffeeScript não deve estar nas visualizações. Você pode fazer Ajax sem isso. Você não precisa gerar JS dinamicamente para fazer Ajax. Na verdade, você não deve gerar JS dinamicamente. Pré-compile seus arquivos CoffeeScript e evite totalmente o problema.
Marnen Laibow-Koser
1
sass-rails se comporta mal porque Bundler.require :assetsnão está sendo executado. Essa não é uma justificativa para remover o grupo de ativos. Eu não quero terubyracer, libv8 et c. na produção, por que alguém faz? O template do Coffee pode ser compilado para um template JS, e não faz sentido compilá-lo cada vez que um novo valor é substituído. Não adianta levar todo esse fardo para a produção.
phil pirozhkov de