33 votes

Comment ignorer universellement les touches de base de données lors de la précompilation d'actifs sur Heroku

Je suis le déploiement d'un Rails 3.1 application pour Heroku du Cèdre de la pile. Avec Heroku de Cèdre et de Rails 3.1, vous pouvez compiler les actifs de vous-même localement, laissez Heroku compiler lorsque vous appuyez (pendant "slug compilation"), ou être compilé juste-à-temps, tandis que l'application est en cours d'exécution. Je veux faire l'option du milieu, laissant Heroku précompiler les actifs.

Lorsque Heroku s'exécute actifs:précompiler tâche, il fait des erreurs avec "impossible de se connecter au serveur" parce que l'application tente de se connecter à la base de données, mais aucune base de données n'est disponible à ce stade de la limace de compilation. Le manque de connexion de base de données est normal et inévitable à ce stade. Je suis à la recherche d'un moyen de passer outre, parce que d'une connexion de base de données n'est pas indispensable à l'actif de précompilation.

La partie de mon application qui tente de se connecter à la base de données est de Concevoir. Il y a un devise_for :users ligne dans les itinéraires.rb qui souhaite regarder le modèle de l'Utilisateur.

Je pourrais juste écrire une tâche rake que les bouchons hors devise_for et d'en faire une prereq d'actifs:précompiler. Je pense qu'il permettrait de résoudre mon problème, mais je suis à la recherche d'une plus universel solution que je pourrais utiliser sur tous les Rails 3.1 application avec ce problème sur Heroku.

Il n'y a rien là-bas, ou pouvez-vous imaginer de quoi que ce soit que les silences de la base de données des erreurs de connexion pendant l'exécution de l'application assez pour avoir un itinéraire et les actifs de la génération de chemin?

Évidemment, si une application a besoin de lire/écrire des données lors du démarrage, nous ne pouvons pas le talon, mais nous avons tous les faux ActiveRecord modèle automatiquement?

46voto

fringd Points 869

ajoutez ceci à config / application.rb

 config.assets.initialize_on_precompile=false                                                  
 

il m'a fallu un certain temps pour le traquer ... l'ajouter à la configuration / environnements / *. rb n'a PAS fonctionné

MISE À JOUR : Cela ne fonctionne pas avec les rails 4

13voto

kch Points 25855

Heroku fait maintenant un des laboratoires du pavillon disponibles qui permettent de l'environnement d'exécution disponibles pendant le temps de compilation, ce qui signifie que votre application sera en mesure de se connecter avec succès à votre DATABASE_URL de la base de données.

Vous devez d'abord installer les laboratoires de plugin:

$ heroku plugins:install http://github.com/heroku/heroku-labs.git

puis activer l' user-env-compile laboratoires de fonctionnalité:

$ heroku labs:enable user-env-compile --app your-app-name

5voto

Philipe Points 1838

Pour moi, le problème est d'activer l'enregistrement en appelant instantiate_observer dans lib/active_record/railtie.rb:92 . Cela chargera les observateurs et les modèles respectifs. has_and_belongs_to_many se connecte ensuite à la base de données.

Je pense que je remplacerai cette méthode lorsque ENV["RAILS_ASSETS_PRECOMPILE"] est présent, qui est utilisé par devise dans le correctif auquel Bradley est lié.

EDIT: Donc, cet extrait de code l'a corrigé pour moi:

 namespace :assets do
  # Prepend the assets:precompile_prepare task to assets:precompile.
  task :precompile => :precompile_prepare

  # This task will be called before assets:precompile to optimize the
  # compilation, i.e. to prevent any DB calls.
  task 'precompile_prepare' do
    # Without this assets:precompile will call itself again with this var set.
    # This basically speeds things up.
    ENV['RAILS_GROUPS'] = 'assets'

    # Devise uses this flag to prevent connecting to the db.
    ENV['RAILS_ASSETS_PRECOMPILE'] = 'true'

    # Prevent loading observers which will load the models which in turn may hit
    # the DB.
    module ActiveModel::Observing::ClassMethods
      def instantiate_observers; end
    end

    # Prevent route drawing because certain gems might get called which will hit
    # the DB.
    class ActionDispatch::Routing::RouteSet
      def draw; end
    end
  end
end
 

4voto

yawn Points 2823

Solution de contournement pour Rails (4.2 edge):

Ajoutez les éléments suivants en tant que /config/initializers/precompile.rb :

 module Precompile

  # Public: ignore the following block during rake assets:precompile
  def self.ignore

    unless ARGV.any? { |e| e == 'assets:precompile' }
      yield
    else
      line = caller.first
      puts "Ignoring line '#{line}' during precompile"
    end

  end

end
 

et utilisez-le dans votre routes.rb comme ceci:

 Precompile.ignore { ActiveAdmin.routes(self) }
 

3voto

Bradley Priest Points 6090

EDIT: Cette réponse n'est pas à jour et ne fonctionne plus - Voir fringd de réponse.

Pas tout à fait universel stubbing, mais concevoir a ajouté une case à maintenant pour corriger ce problème particulier . Voir la question et la fixer sur Github. En fournissant un RAILS_ASSETS_PRECOMPILE environnement config concevoir devraient éviter la construction de routes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X