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

AUTHOR

wreis: Wallace Reis | <w.reis@shadowcat.co.uk>