config.xml as a build artifact for less suffering and easier upgrades
Terminology
-
“platform config.xml” refers to the platform-specific config.xml files,
eg. platforms/android/res/xml/config.xml. This is the final file read by
Cordova at runtime.
-
“app config.xml” refers to the top-level config.xml found in
www/config.xml.
Why the current situation is suffering
-
Chiefly, the platforms/foo/.../config.xml files are both the input and
output of munging by Plugman and the user. This sucks. It makes
automatic upgrades difficult because everybody has a customized config.xml
file in their platforms. It also makes plugin rm harder and less robust in
CLI than it needs to be.
-
Currently only some tags in the app config.xml are actually honoured.
Others are ignored, and this has tripped up our users.
Goals
-
bin/create workflow is unchanged.
-
Final content of the platform config.xml file is unchanged, though the
method of building it in the CLI can change.
-
CLI workflow is unchanged, in terms of what a user types.
-
platform config.xml stops being both input and output under CLI. Less
munging, and easier upgrades. In short, platform config.xml files become
build artifacts.
What we propose to do about it
-
First, adjust the platform template (used by bin/create) to contain two
files:
-
defaults.xml, which is versioned, immutable, and tucked away
somewhere (only CLI accesses it) and contains only the Cordova-specified
platform defaults, such as the preferences, any default
whitelist entries,
etc. It does NOT contain any <author>, <name> or other such tags.
-
platform config.xml, which is the same as it currently is, a complete
config.xml for the HelloWorld app. This means behavior is unchanged
for people who are not using CLI. Plugman still munges this file and
outputs back to it, same as now.
-
Second, adjust the CLI’s cordova create template so that its top-level
app config.xml contains <name>, <author>, <content>, etc. - tags the
user is likely to edit.
-
Third, modify the CLI so that the new cordova prepare flow is:
-
Delete the old platform config.xml.
-
Copy the defaults.xml to config.xml.
-
Re-run the Plugman config munging for every plugin, modifying the
fresh platform config.xml. (The order here is deliberately undefined;
plugins should already not be relying on this.)
-
Run the config munging for the app’s config.xml as well.
-
This results in a freshly built, build-artifact platform config.xml.
Users should not be editing it; their top-level app config.xml
has the last
word and will override any settings the defaults or plugins might make.
-
Note that this means we shouldn’t be needlessly setting defaults
in the app config.xml, since this might prevent plugins from changing
things that need changing.
-
Fourth, extend the app config.xml format so that it can have
<platform>tags, like a plugin.xml.
-
Into this it can put platform-specific things like splashscreens,
preferences and other things, rather than mixing these together in the
config.
-
In particular, it can have <config-file> tags in the usual format