Configuration layouts
A common use case is the need to parametrize an application's config in a way that includes your credentials and the environment's data (for example: db host/port, use of frontend proxy or not, caching, require-ssl, etc). This is simple to achieve until your project starts getting bigger.
Catalyst::Plugin::ConfigLoader
The ConfigLoader plugin gives you the chance to load the config by using its suffix. This approach which will look for a local config file, if specified, in the following order of preference:
- *
$ENV{ MYAPP_CONFIG_LOCAL_SUFFIX } - *
$ENV{ CATALYST_CONFIG_LOCAL_SUFFIX } - *
$c->config->{ 'Plugin::ConfigLoader' }->{ config_local_suffix }
By default the suffix value is local, which will load
myapp_local.conf. If, for example, $ENV{
MYAPP_CONFIG_LOCAL_SUFFIX } is set to testing, ConfigLoader will
try to load myapp_testing.conf instead of myapp_local.conf.
Or you could even load local files for each config set directly from your main file:
# load db config file, in Config::General format
<Model::Database>
schema_class My::Schema
<connect_info>
<<include conf/db_local.conf>>
</connect_info>
</Model::Database>
Both of these approaches get in your way when you have X number of applications with Y number of developers and Z number of boxes for each environment (development, testing, staging and production).
MyCompany::Plugin::ConfigLoader
So, all you need to do is extend the get_config_local_suffix method
from ConfigLoad plugin and implement your own config file loading
logic.
For example:
package MyCompany::Plugin::ConfigLoader;
use strict;
use warnings;
use parent 'Catalyst::Plugin::ConfigLoader';
use Catalyst::Utils ();
use Sys::Hostname();
sub get_config_local_suffix {
my ($c) = @_;
my $username = $ENV{USER} || getpwuid($<);
my ($hostname) = Sys::Hostname::hostname() =~ m/^([^\.]+)/;
my $env_suffix = Catalyst::Utils::env_value($c, 'CONFIG_ENV_SUFFIX');
my $config_local_suffix =
Catalyst::Utils::env_value($c, 'CONFIG_LOCAL_SUFFIX')
|| join('_', grep { $_ } ($username, $hostname, $env_suffix));
return $config_local_suffix;
}
1;
Then, in your app class
use Catalyst qw/+MyCompany::Plugin::ConfigLoader/;
# ...
__PACKAGE__->config( 'Plugin::ConfigLoader' => { file => __PACKAGE__->path_to('conf') } );
This loads a config file under conf directory in your application's
homedir based on current sysuser and hostname
(e.g. myapp_wreis_hercule.conf). You can even set the
CONFIG_ENV_SUFFIX environment variable, and it would be appended to
the config local suffix (e.g. myapp_wreis_hercule_staging.conf).
Remember that you can load a specific config file at any time by setting MYAPP_CONFIG=/path/to/config/file or CATALYST_CONFIG environment variable.
SEE ALSO
Catalyst Advent Calendar 2007-15, Catalyst Advent Calendar 2008-10, Catalyst::Plugin::ConfigLoader::Multi.
AUTHOR
wreis: Wallace Reis | <w.reis@shadowcat.co.uk>