2017-09-04 92 views
1

基于this article,它描述了如何使用Sprockets编写小型SQL清单文件,我有我的SQL视图和函数在每个rake db:migrate自动重新创建。直到最后一次升级到Rails 5.1时,它才奏效。链轮不需要SQL文件的自定义耙任务

突然清单文件被编译,但是每个*= require语句都被忽略,最后我得到一个空的清单文件。我已经尝试了DirectiveProcessor的几种评论样式,有和没有文件扩展名,有和没有相对路径。无论我提供什么,我最终都会得到一个通过数据库执行的空文件。

我的设置

DB /功能/ 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. 
* 


* 

*/ 

所以文件被执行,但看上去是空的......任何人有任何想法?

回答

-1

对于简单合并一堆文件的任务,是不是有点矫枉过正?

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

+0

最初的想法没有来自我。我只是试图解决它。这可能有点过分了,是的,但是,重写整个当前的功能 - 不仅仅是这两种情况 - 在这个阶段也是一种矫枉过正的事情......但是感谢你采用不同的方法,这当然有帮助。 – Vapire

+0

我猜如果你真的需要一个复杂的依赖关系树,你可以在子文件上有清单,这可能是有意义的。但另一方面,链轮甚至不擅长依赖分辨率,并且只需要重复其他文件。 – max

0

尝试添加以下行链轮环境配置块:

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

此外,您还可以添加以下行以支持单行SQL注释:

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