Wednesday, April 23, 2008

Har du set, at Microsoft afholder MIX essentials 08 i København d. 21. maj? (dato rettet fra 22. til 21. - se link til MS. sorry og tak for kommentar Lars) Arrangementet (som er gratis) består af en del foredrag, og henvender sig til webdesignere, interaktive designere og webudviklere.

Find info om det konkrete indhold her

http://www.microsoft.com/danmark/msdn/events/mixessentials08.mspx

posted on Wednesday, April 23, 2008 4:24:15 PM (Romance Standard Time, UTC+01:00)  #    Comments [1]

Faldt lige over en god artikel på MSDN omkring profiling i VS 2008

Find Application Bottlenecks with Visual Studio Profiler

Den beskriver brugen af profileren ved hjælp af et par eksempler, og giver en god introduktion.

VS Profiler er guld værd når man leder efter de sorte huller som sluger performance i koden.

posted on Wednesday, April 23, 2008 6:48:15 AM (Romance Standard Time, UTC+01:00)  #    Comments [0]
 Tuesday, April 15, 2008

Hvis du er hurtig kan du nå at blive en af de første 3.5 MCTS'ere i WCF, WPF eller WF (men du skal godt nok skynde dig ;). Følgende test er netop frigivet:

Hvis en af disse bliver kombineret med 70-536 (som du måske har i forvejen - det er den gamle framework test) bliver du 3.5 MCTS (Microsoft Certified Technology Specialist).

Hvis du venter på den nye ASP.NET 3.5 MCTS test (70-562) å du vente lidt endnu - den er i beta og forventes frigivet i løbet af juni.

posted on Tuesday, April 15, 2008 9:10:23 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]
 Saturday, April 05, 2008

I mindre ASP.NET applikationer har jeg altid brugt en eller anden form for script i forbindelse med deloyment (i større applikationer benyttes TFS, buildserver eller lign.). Tidligere har jeg enten brugt et standard batch (.bat) script eller et WSH (windows script host) script, men efter at Windows Powershell er dukket op er jeg begyndt at bruge det en del. Jeg har dog en fornemmelse af at der ikke er mange udviklere som kender til mulighederne med Powershell - bla i forbindelse med deployment, og derfor syntes jeg det var på sin plads at skrive lidt om deployment med Powershell.

Vi kan tage udgangspunkt i deployment af et simpelt site som du kan finde i zippet form tilknyttet dette indlæg. Ideen er at skabe et Powershell script som foretager følgende:

  1. Opretter eller tømmer en midlertidig mappe under c:\temp som bruges som midlertidig opbevaringsmappe for applikationen
  2. Foretager en kompilering med aspnet_compiler (prekompilering), og placerer resultatet i den førnævnte mappe
  3. Sletter mapper og filer man ikke ønsker skal deployes (eksempelvis intern dokumentation, debug-filer mv). I eksemplet findes der under sitet en Temp-mappe der bla indeholder Powershell-scriptet, og den mappe skal ikke med til produktions- eller testserveren.
  4. Tilretter web.config således, at debug sætter til false (egentlig ikke nødvendigt ved en prekompilering - men det er blot for eksemples skyld),  og appsettings og connectionsstrings tilrettes. Tilretning af connectionsstring(s) er vigtigt fordi det i et script skal være muligt at tilrette en connectionsstring til at ramme en produktions- eller test database. Tilretning af AppSettings kunne eksempelvis bruges til at angive en deployment dato (som dette script), opskrive et versionsnummer eller lign.
  5. Sletter filer og mapper i den mappe som i IIS er sat op til at være applikationsmappe
  6. Kopierer filer og mapper fra den midlertidige mappe (herunder den tilrettede web.config) til IIS mappen. I de fleste situationer kræver dette enten en VPN eller FTP forbindelse til serveren, men her kopieres blot til en mappe på c:\.

Her er et Powershell-script som udfører de forskellige steps:

$source_sti   = "C:\temp\pstest"
$deploy_sti   = "c:\temp\deploy"
$prod_sti     = "c:\tempiis"
$compiler_sti = "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe"
$virtualpath  = "\pstest"

clear;

if( [System.IO.Directory]::Exists( $deploy_sti ) )
{
    write-host "Sletter filer og mapper i "$deploy_sti;   
    Remove-Item $deploy_sti\* -recurse -force -confirm;
}
else
{
    write-host "Opretter "$deploy_sti;
    $null=mkdir "$deploy_sti";
}

write-host "Påbegynder kompilering med aspnet_compiler";
&$compiler_sti -nologo -v $virtualpath -p $source_sti -f -c $deploy_sti;
write-host "Sletter uønskede filer og mapper i "$deploy_sti;
rmdir "$deploy_sti\temp" -force -recurse -confirm;
remove-item $deploy_sti\uønsketfil.txt -confirm;

$webConfigFilePath = $deploy_sti+"\web.config";
write-host "Foretager rettelser i "$webConfigFilePath;

[System.Xml.XmlDocument]$doc = new-object System.Xml.XmlDocument;
$doc.Load($webConfigFilePath);
$root = $doc.get_DocumentElement();

write-host "Sætter debug=false";
$root."system.web".compilation.debug = "false";

write-host "Retter connectionstrings";
write-host "";
$cnstr = @{ 'cnstring'='cnstring sat af Powershell';};
$cnstr;
foreach($navn in $cnstr.Keys)
{
    foreach($item in $root.connectionStrings.add )
    {
        if( $item.name -eq $navn )
        {
            $item.connectionString = $cnstr[$navn];
        }
    }
}
write-host "";
write-host "Retter app.settings";
$d=get-date;
$appsettings = @{ 'app1'='Sat fra Powershell';`
'deploymentdato'=$d.tostring("F") };
$appsettings;
foreach($navn in $appsettings.Keys)
{
    foreach($item in $root.appSettings.add )
    {
        if( $item.key -eq $navn )
        {
            $item.value = $appsettings[$navn];
        }
    }
}
$doc.Save($webConfigFilePath);
write-host "Sletter filer og mapper i"$prod_sti;
Remove-Item $prod_sti\* -recurse -force -confirm;
write-host "Kopiere filer fra "$deploy_sti\*" til "$prod_sti;
Copy-Item $deploy_sti\* $prod_sti -recurse;

write-host "Script afsluttet - afventer et tryk på Enter...";
$null = read-host;

Bemærk især hvor effektivt det er at "lege" med XML i Powershell og hvor nemt det er at kopiere og slette mapper og filer. Der er en del -confirm argumenter på funktioner som sletter filer og mapper. Hvis du vil have scriptet til at køre "af sig selv" kan du bare fjerne argumentet.

Når scriptet afvikles vil det resultere i følgende:

 image

En fuld deployment - inkl. tilretning af web-config - er sket ved at afvikle et enkelt script. Det viste eksempel er som det fremgår rimeligt simpelt, men det kan udvides efter behov. Jeg har script som zipper, mailer, FTP'er, taler med IIS med videre - det er altså ikke småting man kan med Powershell.

Hvis du vil prøve det viste script gør du følgende:

  • Sørg for at Powershell er installeret. Download evt her.
  • Sørg for at Powershell tillader afvikling af scripts. Se evt. her - led efter spørgsmålet "How come I cannot run scripts when I first install Windows PowerShell?" (få en Powershell prompt ved at skrive powershell under Kør på Windows Start-menuen)
  • Hent zip med demo sitet (inkl. script) og pak ud til c:\temp\ (sitet skal ligge under c:\temp\pstest). Find zip-filen nederst i dette indlæg.
  • Opret c:\iistest som scriptet bruger som "IIS" mappe
  • Åben sitet i Visual Studio
  • I Solution Explorer højreklikkes på deploy.ps1 under /temp
  • Vælg Open with...
  • Klik på Add-knappen og find powershell.exe under
    C:\WINDOWS\system32\windowspowershell\v1.0
  • Åben scriptet med Powershell

Nu burde scriptet blive afviklet som ovennævnte billede - check c:\iistest hvor de prekompilerede filer nu ligger, og bemærk tilretningerne i web.config.

image

Advarsel: Bare for en god ordens skyld - afvikling af scriptet er på eget ansvar. Det sletter mapper og filer i c:\temp\deploy og c:\tempiis (dog bruges -confirm jf. ovenfor). Disse mapper kan evt tilrettes i toppen af scriptet, men pas på: scriptet gør bare hvad det bliver bedt om.

Dette indlæg var blot en hurtig introduktion til brug af Powershell ifbm med deployment, og du kan bruge scriptet som inspiration til at udvikle egne scripts.

pstest.zip (3,68 KB)

posted on Saturday, April 05, 2008 3:05:11 PM (Romance Standard Time, UTC+01:00)  #    Comments [3]