.. Authors :
.. mviewer team
.. _config_environmentvar:
Définir des variables d’environnement
=====================================
Pour quoi faire ?
-----------------
Lorsque l'on réalise des cartes dans certains environnements, et que l’on utilise le processus suivant :
#. Développement de la carte en local ==> ``localhost:xxxx/mviewer``
#. Passage sur un environnement de test type recette / pré-pod ==> ``https://map.recette.fr/mviewer``
#. Déploiement final vers l'environnement de production ===> ``https://map.fr/mviewer``
Pour chacun de ces environnements, l'URL change. On doit donc modifier à chaque étape les chemins et URLs des couches dans les XML, customlayers, extensions, customcontrol, etc...
La modification est manuelle et il y a souvent des erreurs. C'est aussi clairement fastidieux pour une carte contenant beaucoup de ressources ou alors lorsque le nombre d’applications à migrer est important.
Concept
-------
Pour faciliter cette transition, un système basé sur un/des fichier(s) ``.json`` permet de définir des **variables d’environnement**.
A noter que par défaut, un fichier ``apps/settings.json`` est fourni.
Les variables d’environnement qui peuvent être contenues dans ce type de fichier sont principalement des liens pour accéder aux ressources des couches. Ils sont donc propres à chaque environnement.
Exemple de variable définie dans ``apps/settings.json`` sur un environnement de recette :
::
{
"fqdn": "map.recette.fr"
}
La même variable définie dans ``apps/settings.json`` sur un environnement de production :
::
{
"fqdn": "map.fr"
}
Ainsi en définissant des variables communes aux différents environnements mais dont seule la valeur change d’un environnement à l’autre, **il n'est plus nécessaire de changer l'URL** des ressources à la main lors du passage d'un fichier de la préproduction à la production.
Comment faire ?
---------------
**1. Créer un fichier définissant les variables**
**Variables globales**
Dans le répertoire ``/apps``, modifiez (ou créer si inexistant) le fichier ``settings.json`` et définissez une ou plusieurs variable(s) comme ci-dessous :
::
{
"fqdn": https://map.recette.fr
}
.. Note::
Les variables définies dans le fichier ``.json`` pourront être appelées dans l’ensemble des applications disponibles dans le répertoire ``/apps``.
**Variables spécifiques à une application**
Si l’on souhaite définir des variables pour une **application spécifique** nommée ``MaCarte.xml``, il est possible de créer un fichier d’environnement dédié à cette application.
Ainsi, dans le même répertoire que l’application, créez un nouveau fichier nommé ``MaCarte.json`` (le fichier d’environnement doit avoir le même nom que le fichier de configuration .XML).
Dans ce fichier, définissez une ou plusieurs variable(s) comme ci-dessous comme on le ferez avec le fichier ``apps/settings.json``:
::
{
"fqdnMaCarte": https://MaCarte.recette.fr
}
.. warning::
Les variables définies dans ce fichier ne pourront être utilisées **que dans l’application associée**, ici ``MaCarte.xml``
**Comportement des fichiers d’environnement**
- On utilise les variables par défaut du fichier ``apps/setings.json``.
- Si aucun fichier ``.json`` n'existe, alors le système actuel et classique fonctionnera afin de lire simplement le XML sans chercher à remplacer des URLs.
- Si le code détecte un fichier ``.json`` du même nom que la config (et au même endroit) alors le fichier ``apps/settings.json`` est surchargé par le fichier ``.json`` qui accompagne la config (donc ``maConfig.json`` surchage et remplace les valeurs communes de ``apps/settings.json``).
- On peut utiliser l'URL pour préciser le fichier ``.json`` à utiliser (``e.g &env=apps/test/test.json``) afin de remplacer le fichier ``apps/settings.json`` par le fichier passé dans l'URL.
- Les ``.json`` sont ignorés par git via le ``.gitignore`` pour ne pas écraser les fichiers selon les environnements et ne pas avoir à le réécrire à chaque mise à jour de son projet Git.
**2. Mobiliser les variables d’environnement dans le fichier de configuration**
Pour appeler les variables dans le fichier de configuration .XML, on utilise la syntaxe Mustache en configurant une couche comme ci-dessous :
.. code-block:: XML
:linenos:
Lors de l'appel du XML au chargement de la carte, le code remplacera l'expression ``{{fqdn}}`` par ``https://ma.recette.fr`` pour obtenir un XML avec les URLs correctes. On aura alors pour notre ```` dans le XML final :
.. code-block:: XML
:linenos:
Cette syntaxe peut être utilisée pour l’ensemble des ressources mobilisées dans le fichier de configuration .XML telles que des styles, des images, des templates, etc …
**3. Mobiliser les variables d’environnement dans un customlayer**
Il est également possible d’appeler les variables d’environnement dans un fichier du type customlayer en configurant votre fichier ``moncustomlayer.js`` comme ci-dessous :
.. code-block:: javascript
:caption: moncustomlayer.js
:linenos:
const url = `https://${mviewer.env?.fqdn}/geoserver/rb/wfs...`;
let layer = new ol.layer.Vector({
source: new ol.source.Vector({
url: url,
format: new ol.format.GeoJSON()
})
});
.. warning::
Pour que cette syntaxe fonctionne, vous devez utiliser des **littéraux de gabarits** ` ` (accent grave au lieu des apostrophes doubles ou simples) pour délimiter l’url.
Cas d’usage
-----------
**Exemple 1**
J'ai une application sur une préprod qui a le domaine : ``map.recette.fr``
Ma carte mviewer utilise un flux WMS de préprod et un customLayer avec un flux WFS de préprod.
Je souhaite pouvoir changer facilement vers une plateforme de production qui a le domaine : ``map.fr``
Alors je saisis sur ma recette ``apps/settings.json`` une variable aléatoire que j'appelle ``fqdn`` :
::
{
"fqdn": "map.recette.fr"
}
et je saisis sur mon serveur de production dans ``apps/settings.json`` la même variable avec la valeur qui convient :
::
{
"fqdn": "map.fr"
}
Dans mon config XML, j'utilise alors pour mon WMS la syntaxe Mustache ``{{fqdn}}``:
.. code-block:: XML
:linenos:
Dans mon customLayer, je peux par ailleurs appeler directement l'URL WFS via :
.. code-block:: javascript
:linenos:
const url = `https://${mviewer.env?.fqdn}/geoserver/rb/wfs...`;
**Exemple 2**
Prenons ces 3 fichiers et le contenu associé :
- ``apps/settings.json``
::
{
"version": "3.8.1-snapshot"
}
- ``demo/test/test.json``
::
{
"fqdn": "https://fqdn.com"
}
- ``demo/test/test.xml``
En chargeant la carte mviewer pour la configuration ``demo/test/test.xml``, je peux déjà ouvrir la console et voir mes variables et valeurs associées en saisissant en JavaScript ``mviewer.env`` afin de les consulter :
::
{
"fqdn": "https://fqdn.com",
"version": "3.8.1-snapshot"
}
On comprend là que ``mviewer.env`` permet d'accéder aux variables depuis un customlayer, le coeur mviewer ou une extension.
Si je souhaite à présent remplacer la valeur de la variable ``version`` fournie dans mon fichier ``apps/settings.json`` par défaut, je n'aurais qu'à l'ajouter avec la nouvelle valeur (ex. : ``inconnu``) dans le fichier ``demo/test/test.json``:
::
{
"fqdn": "https://fqdn.com",
"version": "inconnu"
}
On pourra ici encore obtenir via la console du navigateur la liste des variables et les valeurs avec le code JavaScript ``mviewer.env`` :
::
{
"fqdn": "https://fqdn.com",
"version": "inconnu"
}