Environment reuse

All,

I've run into a few cases recently where I have environments that are nearly (or totally) identical, except for the database. For example, I have a "live" environment locally where I pull production data for load testing or triage, and I generally want it to behave like "development". Similar situations occur for continuous-integration or staging boxen that should look an awful lot like development (or production), but not quite.

In order to make these sorts of situations pleasantly self-documenting, I've patched the Initializer with a little helper:

# config/environments/live.rb acts_like :development

Is this a patchworthy feature? I'd be happy to submit my change and tests if other people see any value here. As this changes Rails' initalization process, it's a bit difficult to elegantly expose as a plugin.

~ j.

I've run into a few cases recently where I have environments that are nearly (or totally) identical, except for the database. For example, I have a "live" environment locally where I pull production data for load testing or triage, and I generally want it to behave like "development". Similar situations occur for continuous-integration or staging boxen that should look an awful lot like development (or production), but not quite.

In order to make these sorts of situations pleasantly self-documenting, I've patched the Initializer with a little helper:

# config/environments/live.rb acts_like :development

Is this a patchworthy feature? I'd be happy to submit my change and tests if other people see any value here. As this changes Rails' initalization process, it's a bit difficult to elegantly expose as a plugin.

Can't you just require common pieces of code from each of the environments? If not, perhaps we should make that simpler to do.

The initializers feature also takes care of a lot of the duplication I used to have between 'production' and 'staging' at present, what stuff are you left with in both files?

> # config/environments/live.rb > acts_like :development

Can't you just require common pieces of code from each of the environments? If not, perhaps we should make that simpler to do.

In the case of two environments that share common pieces of code, absolutely. Where I've found this most useful, though, is in a case where an environment is either *precisely* the same as another (except for the database, e.g., running with a copy of live data on your local dev machine), or differs in the most minor of ways.

This is really just a bit of sugar, of course. It's the equivalent of:

# in config/environments/live.rb

# live should act exactly like development, except for the database eval(IO.read("#{RAILS_ROOT}/config/environments/development.rb"))

As sugar, it may not be a good addition. I sure think "acts_like :development" is nice, though.

The initializers feature also takes care of a lot of the duplication I used to have between 'production' and 'staging' at present, what stuff are you left with in both files?

Love the initializers. Leftover differences between, say, production and staging are mostly totally reasonable stuff, like email addresses or server names/IP's.

~ j.

In the case of two environments that share common pieces of code, absolutely. Where I've found this most useful, though, is in a case where an environment is either *precisely* the same as another (except for the database, e.g., running with a copy of live data on your local dev machine), or differs in the most minor of ways.

Couldn't you achieve this with symlinks though?

Absolutely. The only reason I can think of to use something like my acts_like sugar instead of symlinks is clarity and maintainability over time: I think it's good that anybody who cats/edits the file will immediately know that it mirrors another environment, which isn't necessarily the case with a symlink. We're all moving at lightspeed 'round here, and the more explicit information the better. Symlinks aren't sneaky, but they're certainly not always obvious.

That said, the combination of initializers and symlinks makes my justification pretty thin. :slight_smile:

~ j.