Optimering af udviklingsprocesser: Konfiguration

Automatisering af gentagne manuelle processer kan optimere udviklingstiden, sikre ensartethed og modvirke menneskefejl. Udvikleren skal kunne fokusere på at løse opgaven frem for detaljer udenom. Automatisering af de processer, der ligger tæt på udviklingsmiljøet, er oplagte at integrere direkte i udviklingsmiljøet.

I en udviklingsproces er der flere faser, for eksempel udvikling, test, præproduktion og produktion. Ofte vil der være forskellige opsætninger og afhængigheder til hver fase. Databasen kan være en anden, der skal ikke logges i samme omfang, eller testspecifikke ting skal være slået fra. Alle disse ting vil man typisk konfigurere i en konfigurationsfil, og disse ville skulle ændres, når løsningen skal anvendes i en given fase.

Der er mange måder at gribe konfigurationsstyrring an på. Man kan vedligeholde konfigurationsfiler i hånden, lave script til at erstatte variable for de enkelte miljøer, lave standard XSLT transformationer af XML konfigurationsfiler, mv.

Uanset hvilken løsning man vælger, kræver det, at der bliver lagt noget arbejde i styringen af konfigurationerne. Ofte er det op til udvikleren, hvordan konfigurationsstyringen håndteres, og det kan skabe forskelligartede løsninger.

I Visual Studio 2010 web-projekter er konfigurationstransformationer direkte understøttet. Dette gøres ved at definere forskellige byggekonfigurationer, f.eks. udvikling, test, præproduktion og produktion, højre-klikke på sin web.config og vælge at tilføje transformationer. Når en given byggekonfiguration bygges (kompileres), bliver de passende transformationer lagt ned over konfigurationsfilen. Resultatet af byggeprocessen vil da indeholde en konfigurationsfil, specifikt til det miljø den er bygget. Læs evt. mere omkring Web.config transformationer her: https://msdn.microsoft.com/en-us/library/dd465318.aspx

Konfigurationstransformationer er imidlertid ikke understøttet i andre typer Visual Studio projekter, der typisk anvender App.config konfigurationsfiler. Man kan dog opnå samme funktionalitet, ved at anvende de samme komponenter der anvendes i web-projekter. Her skal udvikleren selv modificere hver enkelt Visual Studio-projektfil, både med en ekstra bygge opgave samt referencer til transformationskonfigurationsfiler, som også skal oprettes. Da Visma Consulting ofte har behov for at den ovennævnte funktionalitet, i andre projekttyper end web-projekter, ser vi det som et oplagt sted at automatisere. Vi valgte derfor at implementere netop denne funktionalitet igennem en Visual Studio Extension kaldet App Config Transforms.

App Config Transform installeres let via Visual Studio Extension Manager:

Når denne er installeret, defineres bygge konfigurationer via Visual Studios Configuration Manager:


Og der vælges at tilføje konfigurations transformationer, ved at højre-klikke på App.config konfigurationsfilen og vælge ”Add Config Transforms”:

Dette medfører at transformationsframeworket bliver refereret, og at transformationen bliver en del af byggeprocessen. Desuden medfører det, at der tilføjes transformationskonfigurationsfiler for hver bygge konfiguration.

Et meget simpelt eksempel, på en transformation er følgende.

Der er defineret en App.config konfigurationsfil, med et element ”environment”. Dette har værdien ”Debug” i standard byg:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add  key="environment" value="Debug"/>
  </appSettings>
</configuration>

Transformationskonfigurationsfilen for ”Staging” bygge konfigurationen (App.Staging.config), indeholder samme element. Forskellen er dog, at den har en ny værdi ”Staging” og instruktion om, at transformationen skal erstatte og at den skal finde elementet der skal erstattes ved at matche nøglen (environment):

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="https://schemas.microsoft.com/XML-Document-Transform" >
  <appSettings>
    <add key="environment"
         value="Staging"
         xdt:Transform="Replace"
         xdt:Locator="Match(key)" />
  </appSettings>
</configuration>

Når man bruger ”Staging”-byggekonfigurationen vil konfigurationsfilen være som følger:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="environment" value="Staging"/>
  </appSettings>
</configuration>

Det er værd at bemærke, at der kun er behov for at angive de elementer i konfigurationsfilen, som skal ændres. Andre elementer fra standard konfigurationen, vil indgå som de fremgår i standard konfigurationsfil.

Der findes mange muligheder for transformationer. Både erstatning og fjernelse af elementer/attributter, indsættelse af nye, indsættelse før/efter et givent match, mv. Der kan søges på forskellige måder, bl.a. ved at matche element navne, ved brug af XPath, ud fra en ”condition”, eg. at attribut @navn er ”Peter” eller @efternavn er ”Petersen”, m.fl. Læs mere omkring muligheder og syntaks for transformation her: https://msdn.microsoft.com/en-us/library/dd465326.aspx

Dette er blot ét eksempel på, hvordan man kan optimere sin udviklingsproces. Vi håber at det kan give inspiration til lignende tiltag hos jer – kildekode udleveres gerne.

Skrevet af Jacob Nielsen og Ulrich Landbo.

Ulrich Landbo arbejder som software arkitekt ved Visma Consulting. Målet er at omsætte kunders forretningsbehov til kode af passende høj kvalitet. Midlerne er god kommunikation med kunder og kollegaer samt faglig inspiration på højt niveau. Han har meninger om arkitektur og kan udstikke en retning, men er ikke mere låst fast end at ham lytter til andre og løbende forbedre sine egne tanker og visioner.