2017-10-11 114 views
0

我有一个Rails应用程序,它通过在Gemfile中显式声明它来运行Rails引擎。我有一个脚本设置用于通过以下方式安装引擎的迁移:rake railties:install:migrations然后迁移。当我运行该脚本时,将安装迁移,但是当迁移运行时,会出现DuplicateMigration错误。我调查这进一步,看到通过引擎引入的Rails迁移路径

Rails.application.paths['db/migrate'].to_a
导致:

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

不知何故从包目录迁移路径被添加到该Rails应用程序的路径。这发生在哪里?有没有办法阻止我的bundle目录中的迁移路径被包含在应用程序路径中?

回答

0

好吧,我做了一些更多的挖掘,事实证明,这实际上是在引擎本身完成的。在engine.rb文件中有一些逻辑改变自动加载的路径。核心逻辑如下:

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 

这是将迁移文件的扩展路径,并将它们推送到路径配置中。这就是为什么我在路径配置中看到/bundle/bundler/gems/mycoolgem-w8ejw9jf/db/migrate