Atualizei um dos meus aplicativos do Rails 4.2.6 para o Rails 5.0.0. o Guia de atualização diz que o recurso Carregamento automático agora está desativado na produção por padrão.
Agora sempre recebo um erro no meu servidor de produção, pois carrego todos os arquivos lib com o carregamento automático no application.rb
arquivo.
module MyApp
class Application < Rails::Application
config.autoload_paths += %W( lib/ )
end
end
Por enquanto, eu configurei o config.enable_dependency_loading
para, true
mas me pergunto se existe uma solução melhor para isso. Deve haver um motivo para o carregamento automático estar desativado na produção por padrão.
lib
dir, um arquivo é facilmente disponível em tempo de execução, mas outro tem de ser requerida manualmente: DValidators
) em pastas diretamente no diretório app /, já que o código é carregado automaticamente.app/services/paylinx/paylinx_service.rb
Definição de classe:module Paylinx class PaylinxService end end
. Eu tentei essasautoload_paths
coisas. não funciona para mim.Respostas:
Minha lista de alterações depois de passar para o Rails 5:
lib
diretórioapp
porque todo o código dentro do aplicativo é carregado automaticamente no dev e ansiosamente carregado no prod e, o mais importante, é carregado automaticamente no desenvolvimento, para que você não precise reiniciar o servidor toda vez que fizer alterações.require
instruções que apontam para suas próprias classes,lib
porque todas elas são carregadas automaticamente de qualquer maneira, se a nomeação de arquivos / diretórios estiver correta e, se você deixar asrequire
instruções, elas poderão interromper o carregamento automático. Mais informações aquiconfig.eager_load = true
em todos os ambientes para ver os problemas de carregamento de código ansiosamente no dev.Rails.application.eager_load!
antes de jogar com os threads para evitar erros de "dependência circular".Se você tiver alguma extensão ruby / rails, deixe esse código dentro do
lib
diretório antigo e carregue-o manualmente no inicializador. Isso garantirá que as extensões sejam carregadas antes de sua lógica adicional, que pode depender dela:fonte
lib
pasta agora? Quero dizer, mover olib
diretório para oapp
diretório parece uma solução alternativa./app/lib/
colocou um arquivo / classe e NÃO é o carregamento automático. testado em trilhos 5.1, novo projetoRails.application.eager_load!
lib
têm uma proximidade percebida diferente do projeto e as coisas noapp
diretório. Várias das outras respostas são melhores que esta.Eu apenas usei, em
config.eager_load_paths
vez deconfig.autoload_paths
mencionar akostadinov no comentário do github: https://github.com/rails/rails/issues/13142#issuecomment-275492070Trabalha no ambiente de desenvolvimento e produção.
Graças Johan para a sugestão de substituir
#{Rails.root}/lib
comRails.root.join('lib')
!fonte
config.eager_load_paths << Rails.root.join('lib')
.config.eager_load_paths += [Rails.root.join('lib')]
vez disso, o To Rails 5.2 usa porqueconfig.eager_load_paths
é uma matriz congeladaapplication.rb
ele funciona usando os dois métodos.O carregamento automático está desativado no ambiente de produção devido à segurança do encadeamento. Obrigado a @ forелёный pelo link.
Resolvi esse problema armazenando os arquivos lib em uma
lib
pasta no meuapp
diretório, conforme recomendado no Github . Todas as pastas daapp
pasta são carregadas pelo Rails automaticamente.fonte
config.eager_load_paths << "#{Rails.root}/lib"
, é melhor o IMO seguir a estrutura de aplicativos recomendada para trilhos.app/lib
é recomendado pelos membros do rails github.com/rails/rails/issues/13142#issuecomment-275549669lib
. Eu esperaria que o amor de mãe ou o DHH entrassem em cena. Enquanto isso, eu (pessoalmente) recomendo seguir a resposta de @Lev Lukomsky./lib
diretório. As bibliotecas de terceiros são na maioria das vezes gemas e, se não, deve haver uma gema criada. Para outros arquivos, eu crio pastas específicas no/app
diretório. Por exemplovalidators
.Aqui está uma longa discussão sobre esse problema. https://github.com/rails/rails/issues/13142
fonte
Isso permite que a lib seja carregada automaticamente e também funciona no ambiente de produção.
PS: Eu mudei minha resposta, agora ela adiciona os dois caminhos de carregamento automático, independentemente do ambiente, para permitir o trabalho em ambientes personalizados também (como estágio)
fonte
Apenas altere config.autoload_paths para config.eager_load_paths no arquivo config / application.rb. Como no Rails 5 o carregamento automático é desativado para o ambiente de produção por padrão. Para mais detalhes, siga o link .
Funciona para o desenvolvimento e produção do ambiente.
fonte
Em certo sentido, aqui está uma abordagem unificada no Rails 5 para centralizar as configurações de carregamento rápido e automático, ao mesmo tempo em que adiciona o caminho de carregamento automático necessário sempre que o carregamento rápido estiver configurado, caso contrário não será possível funcionar corretamente:
fonte
Para alguém que lutou com isso como eu, não basta colocar um diretório abaixo
app/
. Sim, você receberá o carregamento automático, mas não o necessário , o que exige que as convenções de espaço para nome sejam cumpridas .Além disso, o uso do inicializador para carregar o nível raiz antigo
lib
impedirá o recurso de recarregamento durante o desenvolvimento.fonte
Mover a pasta lib para o aplicativo ajudou a resolver um problema, minha API do Twitter não funcionava na produção. Eu tinha "constante TwitterApi não inicializado" e minha API do Twitter estava na minha pasta lib. Eu tinha
config.autoload_paths += Dir["#{Rails.root}/app/lib"]
no meu application.rb, mas não funcionou antes de mover a pasta.Isso fez o truque
fonte
para resumir a resposta de Lev:
mv lib app
bastava ter todo o meulib
código carregado / recarregado automaticamente.(rails 6.0.0beta3, mas também deve funcionar bem no rails 5.x)
fonte