Search code examples
scalaconfigurationenvironment-variablesconfigdevelopment-environment

specific config by environment in Scala


What is a good way to set up a project in Scala which uses different configuration depending on environments.

I need to specifically have different databases for development, test and production environment (similar to what is done in Rails)


Solution

  • Another strategy I'm using consists of using includes. I usually store my DEV settings in the default application.conf file then I create a new conf file for other environments and include the default one.

    Let's say my DEV conf application.conf looks like this:

    myapp {
        server-address = "localhost"
        server-port = 9000
    
        some-other-setting = "cool !"
    }
    

    Then for the PROD, I could have another file called prod.conf:

    include "application"
    
    # override default (DEV) settings
    myapp {
        server-address = ${PROD_SERVER_HOSTNAME}
        server-port = ${PROD_SERVER_PORT}
    }
    

    Note that I override only the settings that change in the PROD environment (some-other-setting is thus the same as in DEV).

    The config bootstrap code doesn't test anything

    ...
    val conf = ConfigFactory.load()
    ...
    

    To switch from the DEV to the PROD conf, simply pass a system property with the name of the config file to load:

    java -Dconfig.resource=prod.conf ...
    

    In DEV, no need to pass it since application.conf will be loaded by default.

    So here we're using Typesafe Config's default loading mechanism to achieve this.

    I've created a simple project to demonstrate this technique. Feel free to clone and experiment.