Using environment variables / parameterizing config.xml
As you mentioned in the post, there is not much documentation about this in the official cordova documentation. After spending some time on this analysis, this is what I concluded:
There is some minimal help available ready-made to parameterize plugin variables available in config.xml
. This can be achieved through preference variables as mentioned in the official cordova link. But the problem with this approach is that its working depends on how on the plugin is coded.
I tried this approach with the facebook plugin, but it didn't work :( I tried as below:
<preference name="MY_CUSTOM_STRING" default="12345678901234567" />
<plugin name="cordova-plugin-facebook4" spec="~1.7.1">
<variable name="APP_ID">$MY_CUSTOM_STRING</variable>
<variable name="APP_NAME" value="My_Appy_App"/>
</plugin>
Tried out the same approach for google maps plugin and it worked :) I tried as below:
<preference name="MY_CUSTOM_STRING" default="12345678901234567" />
<plugin name="cordova-plugin-googlemaps" spec="~1.3.9">
<variable name="API_KEY_FOR_ANDROID">$MY_CUSTOM_STRING</variable>
</plugin>
So all I could conclude is that the parameterizing approach is dependent on the core plugin code.
In the case of the facebook plugin, if you want to parameterize the APP_ID
variable, then I guess hooks are the way to proceed. Even a simple windows batch file to replace a string match should be fine and it can be invoked on pre build action to achieve what you require. Hope it helps.
UPDATE:
I do agree with Brandon's comments.
With the limited time i had, I was able to come up with the cordova hook that resolves this issue. It may be a crude way and it can be refined too but for now this approach works fine. Have posted the hook as a sample app in my github page and the README file has complete info about it. Hope it helps. Keep me posted.
Cordova config.xml environment variables
One solution could be to create hooks for before_plugin_install and after_plugin_install.
On before_plugin_install copy the cordova.tpl.xml to cordova.xml.
... Plugin is installed ...
On after_plugin_install copy cordova.xml to cordova.tpl.xml
Apache Cordova : use different settings in config.xml for debug and release
If you use different environments that are defined in command line, you could create a template config.xml
(the file is config.tpl.xml
) and a before_prepare
cordova hook to replace the variables in the template with the correct values and save the generated content in config.xml
.
The hook is:
#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var compile = require('es6-template-strings/compile');
var resolveToString = require('es6-template-strings/resolve-to-string');
var ROOT_DIR = process.argv[2];
var FILES = {
SRC: "config.tpl.xml",
DEST: "config.xml"
};
var env = process.env.NODE_ENV || 'dev';
var envFile = 'src/environments/environment.' + env + '.json';
var srcFileFull = path.join(ROOT_DIR, FILES.SRC);
var destFileFull = path.join(ROOT_DIR, FILES.DEST);
var configFileFull = path.join(ROOT_DIR, envFile);
var templateData = fs.readFileSync(srcFileFull, 'utf8');
var configData = fs.readFileSync(configFileFull, 'utf8');
var config = JSON.parse(configData);
var compiled = compile(templateData);
var content = resolveToString(compiled, config);
fs.writeFileSync(destFileFull, content);
I use the environment variable as NODE_ENV
here, if you use another (like APP_ENV
) just do the corresponding changes in the hook above. The hook loads a json from src/environments/environment.[env].json
, like environment.dev.json
or environment.prod.json
(it can be changed in the hook above).
In config.tpl.xml
:
<content src="${CONTENT_URL}" />
It would turn into ${CONTENT_URL}
into the correct url, based on the environment file used (you need to have a property CONTENT_URL
in the environment json files).
For more info, see https://stackoverflow.com/a/46345926/4850646
How to pass Maven settings via environment vars
Yes, you can do this in two ways:
- passing properties in the command line, using variables. For example, you can use in your
settings.xml
something like this:
<servers>
<server>
<id>deploymentRepo</id>
<username>${server.username}</username>
<password>${server.password}</password>
</server>
</servers>
And in the command line, pass these variables in this way:
mvn clean package -Dserver.username=yourusername -Dserver.password=yourpassword
Please note that passing password as command-line options is a security issue and therefore prefer the second option.
- exporting environments properties. For example, if you export (in Linux, something like
export SERVER_USERNAME=yourusername
)SERVER_USERNAME
andSERVER_PASSWORD
variables, you can use like this:
<servers>
<server>
<id>deploymentRepo</id>
<username>${env.SERVER_USERNAME}</username>
<password>${env.SERVER_PASSWORD}</password>
</server>
</servers>
For more information about properties, see the reference documentation.
Where do you set and access run-time configuration parameters per environment for service fabric?
In order to have per environment variables for running Service Fabric locally and in the cloud this is what you must do:
- Add your custom config section and parameters to the Settings.xml file of the Service/Actor project (located at \PackageRoot\Config\Settings.xml from the project root). Leave the parameters blank as we will be setting these elsewhere per environment. Here is an example one.
<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<!-- Add your custom configuration sections and parameters here -->
<Section Name="UserDatabase">
<Parameter Name="UserDatabaseConnectionString" Value="" />
</Section>
</Settings>
- In the ApplicationManifest.xml file of your Service Fabric project, there will be
<ServiceManifestImport>
elements for each of your included projects. Underneath that will be a<ConfigOverrides>
element where we will declare what values for our configs will be supplanted by values set per environment in the local and cloud xml files underneath ApplicationParameters in our Service Fabric project. In that same ApplicationManifest.xml file, you'll need to add the parameter that will be present in the local and cloud xml files, otherwise they'll be overwritten upon build.
Continuing with the example above, this is how it would be set.
<Parameters>
<Parameter Name="ServiceName_InstanceCount" DefaultValue="-1" />
<Parameter Name="UserDatabaseConnectionString" DefaultValue="" />
</Parameters>
<ConfigOverrides>
<ConfigOverride Name="Config">
<Settings>
<Section Name="UserDatabase">
<Parameter Name="UserDatabaseConnectionString" Value="[UserDatabaseConnectionString]" />
</Section>
</Settings>
</ConfigOverride>
</ConfigOverrides>
- In the local.xml and cloud.xml files underneath ApplicationParameters in your Service Fabric project, you will specify your environment specific variables like so.
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<Parameters>
<Parameter Name="ServiceName_InstanceCount" Value="1" />
<Parameter Name="UserDatabaseConnectionString" Value="Server=(localdb)\MsSqlLocalDb;Database=Users;User=ReadOnlyUser;Password=XXXXX;" />
</Parameters>
</Application>
- Finally, in your Service/Actor you can access these per-environment configuration variables like so.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];
How to give environmental variable path for file appender in configuration file in log4j
When parsing its configuration file, the expression ${MY_HOME}
will be expanded to the value of the system property named MY_HOME
, not the system environment variable. There's a difference between the two.
To achieve this in a clean way, you'll have to add something like this to the JVM invocation line:
-DMY_HOME=$MY_HOME
That would define the Java system property MY_HOME
to contain the value of the environment variable MY_HOME
.
How to refer environment variable in POM.xml?
Check out the Maven Properties Guide...
As Seshagiri pointed out in the comments, ${env.VARIABLE_NAME}
will do what you want.
I will add a word of warning and say that a pom.xml
should completely describe your project so please use environment variables judiciously. If you make your builds dependent on your environment, they are harder to reproduce
Related Topics
How to Show/Hide Big Image by Clicking on Thumbnails
Window.Scrollto Not Working in Phonegap - Alternative Solution or Workaround
How to Make Cross-Browser CSS3 Code Dry
Jquery - "Fadein Is Not a Function"
How to Get Default Font Size in Pixels by Using JavaScript or Jquery
How to Include CSS Files from an MVC Partial Control
Horizontal Slideshow with Divs
How to Dynamically Change the Style Tag Using JavaScript
Disable Inertia Scroll for "Single-Page" Webapp
Grabbing Style.Display Property via Js Only Works When Set Inline
How to Put a Eventlistener for All Divs Generated by JavaScript
Highlight Multiple Items on Hover's Condition
Websites That Archive Cross-Browser, Cross-Platform CSS/Js Bugs