2017-09-04 59 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: ['--', ['/*', '*/']])