2017-10-11 9 views
0

Ich habe eine Rails-Anwendung, die eine Rails-Engine ausführt, indem sie explizit in der Gemfile deklariert. Ich habe ein Skript eingerichtet, um die Migrationen von der Engine zu installieren: rake railties:install:migrations und dann migriert. Wenn ich das Skript ausführe, werden die Migrationen installiert, aber wenn die Migrationen ausgeführt werden, erhalte ich einen DuplicateMigration-Fehler. Ich untersuchte diese weiter und sah, dassSchienenmigrationspfade durch Engine eingeführt

Rails.application.paths['db/migrate'].to_a
in Folge:

["/src/db/migrate","/bundle/bundler/gems/my_engine-w8ejw9jf/db/migrate"]

Irgendwie ist der Migrationspfad von dem Bündel-Verzeichnis wird auf die Rails-Anwendung Pfade hinzugefügt zu werden. Wo passiert das? Kann ich verhindern, dass die Migrationspfade aus meinem Bundle-Verzeichnis in den Anwendungspfaden enthalten sind?

Antwort

0

Okay, ich habe etwas mehr gegraben und es stellt sich heraus, dass dies tatsächlich in der Engine selbst gemacht wird. In der Datei engine.rb gibt es eine Logik, die die Pfade ändert, die automatisch geladen werden. Die Kernlogik war wie folgt:

class Engine < ::Rails::Engine 
    isolate_namespace MyEngine 

    initializer :append_migrations do |app| 
    unless app.root.to_s.match root.to_s 
     config.paths["db/migrate"].expanded.each do |expanded_path| 
     app.config.paths["db/migrate"] << expanded_path 
     end 
    end 
    end 
end 

Dies nahm die erweiterten Pfade der Migrationsdateien und schob sie in die Pfade Config. Deshalb habe ich /bundle/bundler/gems/mycoolgem-w8ejw9jf/db/migrate in der Pfadkonfiguration gesehen.

Verwandte Themen