2017-09-04 2 views
1

Basé sur this article, qui décrit comment utiliser Sprockets pour écrire de petits fichiers manifest SQL, mes vues et fonctions SQL sont automatiquement recréées sur chaque rake db:migrate. Cela a fonctionné merveilleusement jusqu'à la dernière mise à niveau vers Rails 5.1Pignons ne nécessite pas de fichiers SQL pour la tâche de rake personnalisée

Soudain, les fichiers manifestes sont compilés, cependant chaque instruction *= require est ignorée et je me retrouve avec un fichier manifeste vide. J'ai essayé plusieurs styles de commentaire pour le DirectiveProcessor, avec et sans extensions de fichier, avec et sans chemins relatifs. Peu importe ce que je fournis, je me retrouve avec un fichier vide qui est exécuté via la base de données.

ma configuration

db/fonctions/application.sql

/* 
* This is a manifest file that'll be compiled into application.sql, which will include all the files 
* from db/functions listed below. 
* 
*= require kill_all_connections.sql 
*= require invalidate_emails.sql 
* 
*= require days_until_birthday.sql 
*/ 

lib/tâches/db_functions.rake

namespace :db do 
    desc 'creates DB functions listed in db/functions.sql' 
    task :functions => :environment do 
    sprocket_env = Sprockets::Environment.new do |env| 
     env.register_mime_type('text/sql', '.sql') 
     env.register_processor('text/sql', Sprockets::DirectiveProcessor) 
     env.append_path 'db/functions' 
    end 

    ActiveRecord::Base.connection.execute(sprocket_env['application.sql'].to_s) 
    end 
end 

mon résultat

regardant la console quand j'exécute rails db:functions, je vois ce qui suit:

(69.2ms) /* 
* This is a manifest file that'll be compiled into application.sql, which will include all the files 
* from db/functions listed below. 
* 


* 

*/ 

Ainsi, le fichier est exécuté, mais semble vide ... quelqu'un a des idées?

Répondre

-1

Les Sprockets ne sont-ils pas trop compliqués pour la simple fusion de plusieurs fichiers?

namespace :db do 
    desc 'creates DB functions listed in db/functions.sql' 
    task :functions => :environment do 
    File.open(Rails.root.join('db','functions.sql'), 'w') do |dest| 
     Dir[Rails.root.join('db', 'functions', '*.sql')].each do |f| 
     File.copy_stream(f, dest) 
     end 
    end 
    # ... 
    end 
end 

Si vous avez besoin de les avoir dans un ordre spécifique (pour gérer les dépendances) il suffit d'utiliser un tableau au lieu de Dir[Rails.root.join('db', 'functions', '*.sql')].

+0

L'idée originale n'a pas viens de moi. J'essaie simplement de le réparer. C'est peut-être un peu exagéré, oui, mais réécrire toute la fonctionnalité actuelle - il y a plus que ces deux cas - est aussi un peu exagéré à ce stade ... Mais merci pour votre approche différente, cela aide certainement. – Vapire

+0

Je suppose que si vous aviez vraiment besoin d'une arborescence de dépendances complexe où vous avez un manifeste sur les sous-fichiers, cela pourrait avoir du sens. Mais d'un autre côté, les pignons ne sont même pas bons en résolution de dépendance et nécessiteront simplement les autres fichiers à plusieurs reprises. – max

0

Essayez d'ajouter la ligne suivante au bloc de configuration de l'environnement Pignons:

env.register_bundle_processor 'text/sql', Sprockets::Bundle 

En outre, vous pouvez ajouter la ligne suivante pour soutenir commentaires SQL une seule ligne:

env.register_preprocessor 'text/sql', Sprockets::DirectiveProcessor.new(comments: ['--', ['/*', '*/']])