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')],

Другие вопросы по тегам