通过引擎引入的 Rails 迁移路径

use*_*636 2 ruby-on-rails rails-migrations rails-engines

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

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

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

不知何故,来自 bundle 目录的迁移路径被添加到 Rails 应用程序路径中。这是在哪里发生的?有没有办法可以防止我的包目录中的迁移路径包含在应用程序路径中?

use*_*636 5

好吧,我做了更多的挖掘,结果发现这实际上是在引擎本身中完成的。在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
Run Code Online (Sandbox Code Playgroud)

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