2017-09-04 5 views
1

this articleには、スクローケットを使用して小さなSQLマニフェストファイルを書き込む方法が記載されていますが、rake db:migrateにはSQLビューと関数が自動的に再作成されます。これはRails 5.1への最後のアップグレードまで素晴らしく機能しましたSprocketsはカスタムレイクタスク用に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

をオリジナルのアイデアはしませんでした私から来てください。私は単にそれを修正しようとしています。これはちょっとしたオーバーキルかもしれませんが、現在の機能全体を書き直していますが、この2つのケースだけではありません。この段階では非常に残酷です...しかし、あなたのアプローチが違うと感謝します。 – Vapire

+0

あなたが実際に複雑な依存関係ツリーを必要としているのであれば、それは意味をなさないかもしれないサブファイルのマニフェストを持っていると思います。しかし、一方では、スプロケットは依存性の解決にも優れておらず、他のファイルを繰り返し必要とするだけです。 – max

0

試してみてください。

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

また、あなたは単一行SQLのコメントをサポートするために、次の行を追加することができます。

env.register_preprocessor 'text/sql', Sprockets::DirectiveProcessor.new(comments: ['--', ['/*', '*/']]) 
関連する問題