README: Discuss FAQ on how reference.conf gets resolved

Closes #306, relates to #167
This commit is contained in:
Havoc Pennington 2015-04-09 12:33:01 -04:00
parent d6f7f4c0cb
commit acca3b5c6d

View File

@ -58,6 +58,7 @@ to merge it in.
- [Immutability](#immutability) - [Immutability](#immutability)
- [Schemas and Validation](#schemas-and-validation) - [Schemas and Validation](#schemas-and-validation)
- [Standard behavior](#standard-behavior) - [Standard behavior](#standard-behavior)
- [Note about resolving substitutions in `reference.conf` and `application.conf`](#note-about-resolving-substitutions-in-referenceconf-and-applicationconf)
- [Merging config trees](#merging-config-trees) - [Merging config trees](#merging-config-trees)
- [How to handle defaults](#how-to-handle-defaults) - [How to handle defaults](#how-to-handle-defaults)
- [Understanding `Config` and `ConfigObject`](#understanding-config-and-configobject) - [Understanding `Config` and `ConfigObject`](#understanding-config-and-configobject)
@ -70,12 +71,14 @@ to merge it in.
- [Inheritance](#inheritance) - [Inheritance](#inheritance)
- [Optional system or env variable overrides](#optional-system-or-env-variable-overrides) - [Optional system or env variable overrides](#optional-system-or-env-variable-overrides)
- [Concatenation](#concatenation) - [Concatenation](#concatenation)
- [`reference.conf` can't refer to `application.conf`](#referenceconf-cant-refer-to-applicationconf)
- [Miscellaneous Notes](#miscellaneous-notes) - [Miscellaneous Notes](#miscellaneous-notes)
- [Debugging Your Configuration](#debugging-your-configuration) - [Debugging Your Configuration](#debugging-your-configuration)
- [Supports Java 8 and Later](#supports-java-8-and-later) - [Supports Java 8 and Later](#supports-java-8-and-later)
- [Rationale for Supported File Formats](#rationale-for-supported-file-formats) - [Rationale for Supported File Formats](#rationale-for-supported-file-formats)
- [Other APIs (Wrappers and Ports)](#other-apis-wrappers-and-ports) - [Other APIs (Wrappers and Ports)](#other-apis-wrappers-and-ports)
- [Scala wrappers for the Java library](#scala-wrappers-for-the-java-library) - [Scala wrappers for the Java library](#scala-wrappers-for-the-java-library)
- [Clojure wrappers for the Java library](#clojure-wrappers-for-the-java-library)
- [Ruby port](#ruby-port) - [Ruby port](#ruby-port)
- [Python port](#python-port) - [Python port](#python-port)
@ -254,6 +257,29 @@ configuration. In the replacement config file, you can use
file; after the include statement you could go on to override file; after the include statement you could go on to override
certain settings. certain settings.
#### Note about resolving substitutions in `reference.conf` and `application.conf`
The substitution syntax `${foo.bar}` will be resolved
twice. First, all the `reference.conf` files are merged and then
the result gets resolved. Second, all the `application.conf` are
layered over the `reference.conf` and the result of that gets
resolved again.
The implication of this is that the `reference.conf` stack has to
be self-contained; you can't leave an undefined value `${foo.bar}`
to be provided by `application.conf`, or refer to `${foo.bar}` in
a way that you want to allow `application.conf` to
override. However, `application.conf` can refer to a `${foo.bar}`
in `reference.conf`.
This can be frustrating at times, but possible workarounds
include:
* putting an `application.conf` in a library jar, alongside the
`reference.conf`, with values intended for later resolution.
* putting some logic in code instead of building up values in the
config itself.
### Merging config trees ### Merging config trees
Any two Config objects can be merged with an associative operation Any two Config objects can be merged with an associative operation
@ -696,6 +722,14 @@ concatenation, but not object/array concatenation. `+=` does not
work in Play/Akka 2.0 either. Post-2.0 versions support these work in Play/Akka 2.0 either. Post-2.0 versions support these
features. features.
### `reference.conf` can't refer to `application.conf`
Please see <a
href="#note-about-resolving-substitutions-in-referenceconf-and-applicationconf">this
earlier section</a>; all `reference.conf` have substitutions
resolved first, without `application.conf` in the stack, so the
reference stack has to be self-contained.
## Miscellaneous Notes ## Miscellaneous Notes
### Debugging Your Configuration ### Debugging Your Configuration