Quantcast
Channel: Valdis Iljuconoks | Tech Fellow Consulting » Windows Azure
Viewing all articles
Browse latest Browse all 5

Debugging locally, testing in the cloud..

$
0
0

Dažreiz sanāk kaut ko pameistarot Windows Phone 7 platformai (piemēram, http://bit.ly/atmfinder) un nesen saskāros ar interesantu problēmu. Izmantot spraudni SlowCheetah (lejupielādēt var šeit), tīmekļa projektos var ērti veikt Xml failu transformācijas, ja tādas ir nepieciešamas. Transformācija var būt katrai projekta konfigurācijai sava – piemēram, lokālā izstrādes vide izmanto vienus uzstādījumus, bet savukārt kopējā testēšanas un skaņošanas instalācijai nepieciešami pavisam citi uzstādījumu. Šo uzstādījumu regulācija un kontrole notiek izmantojot risinājuma uzstādījumus (Configuration Settings).

Izmantojot šo lielisko iespēja, nodomāju, ka varētu ieviest vairākas konfigurācijas arī manai aplikācijai: piemēram, ar vienas konfigurācijas palīdzību (pārsvarā tiek izmantots emulatorā) es varētu testēt un skaņot sistēmu, izmantojot lokālos tīmekļa pakalpojumus (WCF servisa adrese būtu http://localhost/..), savukārt ar citu uzstādījumu palīdzību, varētu regulēt konfigurāciju, ka tīmekļa pakalpojumu atrodas kaut kur – ārā (WCF servisa adrese sāktos ar http://<kaut kāds mistisks id, kas laikam domāts Azure instances identificēšanai>/..).

Šim nolūkam WCF klienta bibliotēka jau savu konfigurācijas fragmentus saglabā ServiceReferences.ClientConfig failā, kas ir parasts Xml fails. Šāda veida Xml faili ir ļoti labs kandidāts Xml transformācijai dažādās konfigurācijās dažādām vajadzībām.

Konfigurācijas faili izskatās šādi:

 

Oriģinālais fails:

 

  1. <configuration>
  2.   <system.serviceModel>
  3.     <bindings>
  4.       <customBinding>
  5.         <binding name="CustomBinding_IAtmFinderService">
  6.           <binaryMessageEncoding/>
  7.           <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
  8.         </binding>
  9.       </customBinding>
  10.     </bindings>
  11.     <client>
  12.       <endpoint address="http://localhost:81/AtmFinderService.svc"
  13.           binding="customBinding" bindingConfiguration="CustomBinding_IAtmFinderService"
  14.           contract="CloudServiceReference.IAtmFinderService" name="CustomBinding_IAtmFinderService" />
  15.     </client>
  16.   </system.serviceModel>
  17. </configuration>

 

Viens no transformācijas failiem, kas uzstāda servisa adresi uz to mākoņa pakalpojumu:

 

  1. <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  2.   <system.serviceModel>
  3.     <client>
  4.       <endpoint address=http://azure-instances-id.cloudapp.net/AtmFinderService.svc name="CustomBinding_IAtmFinderService"
  5.                 xdt:Transform="SetAttributes(address)" xdt:Locator="Match(name)"/>
  6.     </client>
  7.   </system.serviceModel>
  8. </configuration>

 

 

Sākotnēji likās iespēja tiešām lieliska un eleganta, bet pēc neilgiem eksperimentiem atklājās, ka SlowCheetah tiek izpildīts sekmīgi, bet XAP failā aiziet oriģinālais Xml / .config fails no source direktorijas (direktorijas, kurā atrodas projekta sakne), savukārt spraudnis transformē oriģinālo failu no source direktorijas pārveidojot to kopē vietā, kur tiek novietoti arī pārējie projekta izejas artefakti.

 

Šis fakts traucē Xap failā iekļauj pareizo jau *transformēto* failu.

Izstaigājot Silverlight MSBuild konfigurācijas definīcijas failus, sapratu, ka labāk nemēģināt pārtaisīt, bet gan pielāgoties Xap faila pakošanas procesam.

Beigu beigās sanāca .targets fails, kas domāts tieši priekš šādam situācijām, kad nepieciešams WCF klienta konfigurācijas failus transformēt un rezultātu iekļaut Xap failā.

 

  1. <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  2.   <Target Name="BeforeBuild">
  3.     <CallTarget Targets="TransformAllFiles" />
  4.     <Exec Command="attrib -r ServiceReferences.ClientConfig" WorkingDirectory="$(MSBuildProjectDirectory)" />
  5.     <Exec Command="xcopy &quot;$(OutDir)ServiceReferences.ClientConfig&quot; ServiceReferences.ClientConfig /y" WorkingDirectory="$(MSBuildProjectDirectory)" />
  6.   </Target>
  7. </Project>

 

Šo .targets failu var iekļaut savā projektā:

 

  1. <Import Project="ServiceReferences.Transform.targets" />

 

 

Ja slinkums pārrakstīt faila saturu, tad fails pilnā saturā pieejams šeit.

Šim paņēmienam ir gan viena neliela problēmiņa, kuru man nav izdevies vēl atrisināt –> pēc sekmīga būvējuma, oriģinālais fails satur transformētā faila saturu. Jāatdzīst, ka man neizdevās sameklēt notikumu, kas tiktu izsaukts pašās build procesa beigās (AfterEndToEndIteration notikums nestrādā). Savukārt, ja transformācijas ir rakstītas pareizi, tad šai niansei nevajadzētu sagādāt nekādas problēmas.

 

 

Cerams, ka noderēs!

The post Debugging locally, testing in the cloud.. appeared first on Valdis Iljuconoks | Tech Fellow Consulting.


Viewing all articles
Browse latest Browse all 5

Trending Articles