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



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


Rails.application.paths['db/migrate'].to_a 结果是:

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

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

好的,

我做了更多的挖掘,事实证明这实际上是在引擎本身中完成的。在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的原因。

最新更新