-
Couldn't load subscription status.
- Fork 344
Description
A lot of people have been bitten by the fact that spring doesn't reload application config (database.yml, config/initializers) with new environment variables. DATABASE_URL is a perfect example. There is a PR that attempts to solve part of the problem (#267), but even the comments there indicate there is still room for confusing behavior.
We need a way to specify a set of environment variables that should trigger a full reload. By default, it may just include DATABASE_URL, but you should be able to add your own environment variables to that list, in case you use them in initializers.
I tried diving into the code to create a PR, but don't have a strong enough understanding of the different environments in play. I wrote a failing test that demonstrates the problem.
test "changing specific environment variables should reload all configuration" do
File.write(app.path('config/initializers/set_foo.rb'), <<-CONFIG)
Rails.application.config.foo = ENV['FOO']
CONFIG
app.env['FOO'] = 'first'
assert_success "bin/rails runner 'p Rails.application.config.foo'", stdout: "first"
app.env['FOO'] = 'second'
assert_success "bin/rails runner 'p Rails.application.config.foo'", stdout: "second"
endAs an example, I can get this to pass by making the following change:
# lib/spring/client/run.rb
def call
if true # check if important environment variable changed
stop_server
cold_run
elsif env.server_running?
warm_run
else
cold_run
end
rescue Errno::ECONNRESET
exit 1
ensure
server.close if @server
endObviously, that isn't what we want, since it reboots the server every time. But if we could detect the ENV change at that point, we could conditionally restart everything.