load_tasks loads the active record database tasks twice causing them to execute twice in certain scenarios
Opened this issue · 1 comments
I've noticed that when I have a simple Rakefile
like this
Bundler.require(:default)
StandaloneMigrations::Tasks.load_tasks
Running the command bin/rake db:schema:load
with my structure.sql
will fail with confusing errors, because my structure.sql
file does not work when it's run twice.
I discovered these two lines below cause the db:schema:load
task to be defined twice in rake, and thus rake executes them twice.
I was able to prevent it locally with the following monkey patch.
module Kernel
alias old_load load
def load(*args, **kwargs)
return old_load(*args, **kwargs) unless args[0] == "active_record/railties/databases.rake"
@@load ||= old_load(*args, **kwargs)
end
end
According to rake, executing tasks twice when defining them twice is intended behaviour: ruby/rake#228 (comment)
I finally figured this out. The issue boils down to incompatibility with the strong_migrations gem. Here's a very simple Rakefile
to reproduce the issue.
require 'rails' # need to make sure defined?(Rails) is true for strong_migrations
require 'strong_migrations'
require 'standalone_migrations'
StandaloneMigrations::Tasks.load_tasks
strong_migrations
through a series of require
s calls load "active_record/railties/databases.rake"
.
https://github.com/ankane/strong_migrations/blob/1146d6836bda6c1d8b51287bba73613edfce9e82/lib/strong_migrations/railtie.rb#L2
https://github.com/rails/rails/blob/784f1c75a08b3b3611b4f100a890c26ace493138/activerecord/lib/active_record/railtie.rb#L57