Target switching
Als ik start met het werken aan een website ga ik natuurlijk niet meteen aan de slag op de productie-server. Ik zet eerst een lokale omgeving op, met o.a. een nieuwe database en een nieuwe virtual host in het geval van een Apache server. Op het moment dat de site stabiel genoeg is om het daglicht te zien, zit ik dan altijd te knoeien met het aanpassen van de configuratie, zoals de locatie en login-gegevens van de database.
Om lokaal verder te kunnen ontwikkelen moet ik alles weer opnieuw aanpassen. Een mogelijke optie is om in een centrale file een variabele bij te houden, ENVIRONMENT
, die dan kan gebruikt worden om, afhankelijk van de omgeving, de juiste code uit te voeren. Veel geprul en een hoopje if
blocks die de code niet overzichtelijker maken.
Om m’n Python-skills wat te oefenen heb ik besloten om dit probleem op te lossen met een eenvoudig script: Pants.
Hoe Pants werkt
De websites waaraan ik werk, plaats ik steevast in de C:\web
directory. Deze website vind ik dan terug onder C:\web\el73.be
. Om mijn Wordpress-installatie ook op mijn computer te kunnen gebruiken heb ik een aparte database aangemaakt. Die database komt echter totaal niet overeen met de database op de echte el73.be server. De configuratie van Wordpress, in C:\web\el73.be\weblog\wp-config.php
, moet dus worden aangepast naargelang de omgeving. De inhoud van wp-config.php
ziet er standaard als volgt uit:
define('DB_NAME', 'wordpress'); // The name of the database
define('DB_USER', 'username'); // Your MySQL username
define('DB_PASSWORD', 'password'); // ...and password
define('DB_HOST', 'localhost'); // 99% chance you won't need to change this value
// Meer...
Stap 1: templates
Ik kopieer de configuratie naar C:\web\el73.be_template\weblog\wp-config.php
en vervang de database gegevens:
define('DB_NAME', '@db.name@'); // The name of the database
define('DB_USER', '@db.user@'); // Your MySQL username
define('DB_PASSWORD', '@db.password@'); // ...and password
define('DB_HOST', '@db.host@'); // 99% chance you won't need to change this value
// Meer...
Stap 2: de waarden van de parameters
In C:\web\el73.be_params
maak ik vervolgens 2 files, local.properties
en prod.properties
, eentje voor elke omgeving.
De lokale zou er als volgt kunnen uitzien:
db.name=el73
db.user=root
db.password=rootpassword
db.host=localhost
De andere zou er als volgt kunnen uitzien:
db.name=prod_el73
db.user=prod_el73_user
db.password=prod_el73_password
db.host=mysql.el73.be
Stap 3: target switching
Als ik lokaal wil werken run ik dan het script met als parameters C:\web\el73.be
en local
. Pants zal de files uit de template directory gaan kopiëren naar de gegeven directory en de waarden uit de C:\web\el73.be_params\local.properties
file gaan gebruiken om de parameters in de template te vervangen.
De template en parameters directories moeten op hetzelfde niveau staan als de target directory en eindigen in _template
, respectievelijk _params
. De properties file mag eender welke naam krijgen, zolang die maar eindigt in .properties
. ammehoela.properties
is dus perfect mogelijk, je moet het script dan enkel aanroepen met als parameters je target directory en ammehoela
.
Om te switchen naar de productie-omgeving van el73.be, moet ik gewoon het volgende doen:
C:\>pants.py C:\web\el73.be prod
En zo worden de database-gegevens voor de productie-omgeving ingevuld in C:\web\el73.be\weblog\wp-config.php
.
Voor de geïnteresseerden: Pants is beschikbaar voor download (4 KB). No warranty, doe ermee wat je wilt, etc.
Dit artikel werd opgenomen in ontwikkeling, software.