Comment gérez-vous les variables / constantes de configuration pour différents environnements?
Cela pourrait être un exemple:
Mon API de repos est accessible localhost:7080/myapi/
, mais mon ami qui travaille sur le même code sous le contrôle de version Git a déployé l'API sur son Tomcat localhost:8099/hisapi/
.
Supposons que nous ayons quelque chose comme ça:
angular
.module('app', ['ngResource'])
.constant('API_END_POINT','<local_end_point>')
.factory('User', function($resource, API_END_POINT) {
return $resource(API_END_POINT + 'user');
});
Comment injecter dynamiquement la valeur correcte du point de terminaison API, en fonction de l'environnement?
En PHP, je fais généralement ce genre de choses avec un config.username.xml
fichier, en fusionnant le fichier de configuration de base (config.xml) avec le fichier de configuration de l'environnement local reconnu par le nom de l'utilisateur. Mais je ne sais pas comment gérer ce genre de chose en JavaScript?
la source
'ngconstant:development'
en'serve'
- si vous le mettre dans la configuration de la montre sous'gruntfile'
quetasks: ['ngconstant:development']
- vous ne devez redémarrergrunt serve
lorsque vous mettez à jour les variables de développement dans le gruntfile.package: grunt.file.readJSON('development.json')
Une solution intéressante pourrait être de séparer toutes les valeurs spécifiques à l'environnement dans un module angulaire distinct, sur lequel tous les autres modules dépendent:
Ensuite, vos modules qui ont besoin de ces entrées peuvent en déclarer une dépendance:
Maintenant, vous pourriez penser à d'autres trucs sympas:
Le module, qui contient la configuration, peut être séparé en configuration.js, qui sera inclus sur votre page.
Ce script peut être facilement édité par chacun de vous, tant que vous ne consignez pas ce fichier séparé dans git. Mais il est plus facile de ne pas archiver la configuration si elle se trouve dans un fichier séparé. En outre, vous pouvez le ramifier localement.
Maintenant, si vous avez un système de build, comme ANT ou Maven, vos étapes supplémentaires pourraient être l'implémentation de certains espaces réservés pour les valeurs API_END_POINT, qui seront remplacés pendant la construction, avec vos valeurs spécifiques.
Ou vous avez votre
configuration_a.js
etconfiguration_b.js
et décidez au backend lequel inclure.la source
Pour les utilisateurs de Gulp , gulp-ng-constant est également utile en combinaison avec gulp-concat , event-stream et yargs .
Dans mon dossier de configuration, j'ai ces fichiers:
Ensuite, vous pouvez exécuter
gulp config --env development
et cela créera quelque chose comme ceci:J'ai aussi cette spécification:
la source
Pour y parvenir, je vous suggère d'utiliser le plugin AngularJS Environment: https://www.npmjs.com/package/angular-environment
Voici un exemple:
Et puis, vous pouvez appeler les variables de vos contrôleurs comme ceci:
J'espère que ça aide.
la source
angular-environment
détecte l'environnement? c'est-à-dire que devez-vous faire sur votre machine / serveur Web local pour qu'il sache qu'il s'agit respectivement de dev / prod?envServiceProvider.check()
... définira automatiquement l'environnement approprié en fonction des domaines donnés". Je pense donc qu'il détecte le domaine actuel et définit l'environnement de manière appropriée - il est temps de le tester!Vous pouvez utiliser
lvh.me:9000
pour accéder à votre application AngularJS, (lvh.me
pointe simplement vers 127.0.0.1), puis spécifiez un point de terminaison différent s'illvh.me
s'agit de l'hôte:Ensuite, injectez le service de configuration et utilisez-le
Configuration.API
partout où vous en avez besoin pour accéder à l'API:Un peu maladroit, mais fonctionne très bien pour moi, bien que dans une situation légèrement différente (les points de terminaison API diffèrent en production et en développement).
la source
window.location.host
me suffisait largement.Nous pourrions également faire quelque chose comme ça.
Et dans votre
controller/service
, nous pouvons injecter la dépendance et appeler la méthode get avec la propriété à laquelle accéder.$http.get(env.get('apiroot')
retournerait l'URL en fonction de l'environnement hôte.la source
Bonne question!
Une solution pourrait être de continuer à utiliser votre fichier config.xml et de fournir des informations de point de terminaison api du backend à votre html généré, comme ceci (exemple en php):
Ce n'est peut-être pas une jolie solution, mais cela fonctionnerait.
Une autre solution pourrait être de conserver la
API_END_POINT
valeur constante telle qu'elle devrait être en production et de modifier uniquement votre fichier d'hôtes pour pointer cette URL vers votre API locale à la place.Ou peut-être une solution utilisant
localStorage
des remplacements, comme ceci:la source
Très tard dans le fil, mais une technique que j'ai utilisée, pré-angulaire, est de tirer parti de JSON et de la flexibilité de JS pour référencer dynamiquement les clés de collection et utiliser des faits inaliénables de l'environnement (nom du serveur hôte, langue actuelle du navigateur , etc.) comme entrées pour discriminer / préférer sélectivement les noms de clés suffixés dans une structure de données JSON.
Cela fournit non seulement un contexte d'environnement de déploiement (par OP), mais tout contexte arbitraire (tel que le langage) pour fournir i18n ou tout autre écart requis simultanément, et (idéalement) dans un manifeste de configuration unique, sans duplication et clairement visible.
EN ENVIRON 10 LIGNES VANILLE JS
Exemple trop simplifié mais classique: une URL de base de point de terminaison API dans un fichier de propriétés au format JSON qui varie selon l'environnement où (natch) le serveur hôte variera également:
Une clé de la fonction de discrimination est simplement le nom d'hôte du serveur dans la demande.
Ceci, naturellement, peut être combiné avec une clé supplémentaire basée sur les paramètres de langue de l'utilisateur:
L'étendue de la discrimination / préférence peut être limitée à des clés individuelles (comme ci-dessus) où la clé "de base" n'est écrasée que s'il y a une clé correspondante + suffixe pour les entrées de la fonction - ou une structure entière, et cette structure elle-même récursivement analysé pour faire correspondre les suffixes de discrimination / préférence:
Donc, si un utilisateur visitant le site Web de production a un paramètre de préférence de langue allemande ( de ), la configuration ci-dessus se réduirait à:
À quoi ressemble une telle fonction de réécriture JSON de préférence / discrimination magique? Pas tant:
Dans nos implémentations, qui incluent les sites Web angulaires et pré-angulaires, nous démarrons simplement la configuration bien avant les autres appels de ressources en plaçant le JSON dans une fermeture JS auto-exécutable, y compris la fonction prefer (), et en alimentant les propriétés de base du nom d'hôte et code de langue (et accepte tous les suffixes arbitraires supplémentaires dont vous pourriez avoir besoin):
Un site pré-angulaire aurait maintenant une fenêtre.app_props réduite (pas de clés suffixées @) à laquelle faire référence.
Un site angulaire, en tant qu'étape bootstrap / init, copie simplement l'objet props perdu dans $ rootScope et (éventuellement) le détruit de la portée globale / fenêtre
à injecter ensuite dans les contrôleurs:
ou référencé à partir des liaisons dans les vues:
Des mises en garde? Le caractère @ n'est pas un nom de variable / clé JS / JSON valide, mais jusqu'à présent accepté. Si c'est une rupture, remplacez toute convention que vous aimez, comme "__" (double soulignement) tant que vous y tenez.
La technique pourrait être appliquée côté serveur, portée sur Java ou C # mais votre efficacité / compacité peut varier.
Alternativement, la fonction / convention pourrait faire partie de votre script de compilation frontal, de sorte que le JSON complet, tout environnement / tout langage, n'est jamais transmis sur le câble.
METTRE À JOUR
Nous avons développé l'utilisation de cette technique pour autoriser plusieurs suffixes à une clé, pour éviter d'être obligé d'utiliser des collections (vous pouvez toujours, aussi profondément que vous le souhaitez), ainsi que pour respecter l'ordre des suffixes préférés.
Exemple (voir aussi jsFiddle de travail ):
1/2 (utilisation de base) préfère les clés '@dev', supprime toutes les autres clés suffixées
3 préfère '@dev' à '@fr', préfère '@ dev & fr' à tous les autres
4 (identique à 3 mais préfère '@fr' à '@dev')
5 pas de suffixes préférés, supprime TOUTES les propriétés suffixées
Il accomplit cela en notant chaque propriété suffixée et en promouvant la valeur d'une propriété suffixée à la propriété non suffixée lors de l'itération sur les propriétés et de la recherche d'un suffixe ayant un score plus élevé.
Quelques efficacités dans cette version, y compris la suppression de la dépendance à JSON pour la copie en profondeur, et la récurrence uniquement dans les objets qui survivent à la ronde de notation à leur profondeur:
la source
Si vous utilisez Brunch , le plugin Constangular vous aide à gérer les variables pour différents environnements.
la source
Avez-vous vu cette question et sa réponse?
Vous pouvez définir une valeur globalement valide pour votre application comme ceci:
puis l'utiliser dans vos services. Vous pouvez déplacer ce code dans un fichier config.js et l'exécuter au chargement de la page ou à un autre moment opportun.
la source