Sprockets не требует файлов SQL для пользовательской задачи грабли
Основываясь на этой статье, которая описывает, как использовать Sprockets для написания небольших файлов манифеста SQL, мои представления и функции SQL автоматически воссоздаются на каждом rake db:migrate
, Это прекрасно работало до последнего обновления до Rails 5.1
Внезапно файлы манифеста скомпилированы, однако каждый *= require
оператор игнорируется, и я получаю пустой файл манифеста. Я пробовал несколько стилей комментариев для DirectiveProcessor
, с и без расширений файлов, с и без относительных путей. Независимо от того, что я предоставляю, я получаю пустой файл, который выполняется через БД.
мои настройки
дБ / функции / 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/ задачи /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
мой результат
глядя на консоль, когда я выполняю rails db:functions
Я вижу следующее:
(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.
*
*
*/
Таким образом, файл исполняется, но выглядит пустым... У кого-нибудь есть идеи?
2 ответа
Попробуйте добавить следующую строку в блок конфигурации среды Sprockets:
env.register_bundle_processor 'text/sql', Sprockets::Bundle
Также вы можете добавить следующую строку для поддержки однострочных комментариев SQL:
env.register_preprocessor 'text/sql', Sprockets::DirectiveProcessor.new(comments: ['--', ['/*', '*/']])
Разве Sprockets не слишком излишни для задачи простого объединения файлов?
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
Если вам нужно, чтобы они были в определенном порядке (для управления зависимостями), просто используйте массив вместо Dir[Rails.root.join('db', 'functions', '*.sql')]
,