Category Archives: Development Tools

NuGet – poznámky z přednášky

Pár mých poznámek z přednášky o NuGet (Package Manager ve VS od Microsoftu), které zřejmě nebudu dále zpracovávat.

(Microsoft MVP Summit 2012 Seattle)

Links

Tvorba vlastního package

  • NuGet Command Line (ke stažení přes samotný NuGet)
  • VS / New Project / Class Library
    • NuGet.exe pack <.csproj file>
      • vznikne .nupkg
      • je to zip ála .docx
    • NuGet.exe push <.nupkg file>
  • [global: AssemblyInformationVersion(„any string“)]
    • pre-release = číslo verze obsahuje podtržítko

Nastavení vlastního NuGet feedu ve VS11

  • Tools / Library Package Manager / Package Manager Settings / Package Sources
  • dá se tam nastavit FilePath, kde mám své packages
  • nebo použít package „NuGet.Server“
    • Install-Package NuGet.Server
    • stáhne SLN s jednoduchým servříkem

Code Contracts Editor Extensions – konečně contracty v Intellisense tooltipech

Samotné Code Contracts se díky pomalému rewritingu (a ještě pomalejší statické analýze, ale u té je to logické) v praxi stávaly problémem, kdy nejeden vývojář pochyboval, jestli je ochoten obětovat své pohodlí rychlosti buildů na oltář Code Contractů.

Microsoft konečně přichází s dalším logickým krokem, na který všichni tak dlouho čekají, a který by mohl pomyslné váhy opět lehce převážit ve prospěch Code Contracts – po instalaci Code Contracts Editor Extensions (doplňku do Visual Studia 2010) se Vám contracty budou zobrazovat v tooltipových nápovědách IntelliSense.

Windows Live Sync (ex-Mesh): Synchronizace nastavení Visual Studia, ale i Office (Outlook podpisů, auto-correct, atp.)

Poměrně krátce si hraju s Windows Live Sync Beta (dříve Live Mesh) a už mě zaujali dvě příjemné možnosti:

  • synchronizace Office-nastavení – včetně Outlook podpisů, nastavení auto-correct options a dalších věcí, které mě vždy vytáčí do běla, že je musím znovu a znovu nastavovat na čistých instalacích. Synchronizace Office je ve Windows Live Sync vestavěná, stačí ji jen zapnout
  • synchronizace nastavení Visual Studia – stačí použít synchronizaci souborů – nastavení Visual Studia se ukládá do souboru, který určíte v Options / Import and Export Settings / Automatically save my settings to this file: […]. Nasměrujte si soubor do samostatné složky a tu synchronizujte mezi počítači.

Live Sync Beta mi přijde nějaká chudší, než byl Mesh, ale svůj účel snad splní stejně a možná časem i lépe.

VS2010 – Lokalizace do češtiny ke stažení

V rámci snahy o zpřístupnění vývojářských nástrojům „širokým masám“ uvedl dnes Microsoft další ztřeštěnost -Jazykovou sadu pro češtinu, která Vám umožní přepnout prostředí Visual Studia 2010 Professional do češtiny. Lokalizační sada je ke stažení ze stránek MSDN.cz.

Tož přeji hodně štěstí těm, co se při svém prvním sestavení řešení (build solution) dostanou až k sestavení (assembly). Osobně odmítám komunikovat s kýmkoliv, kdo by na mě zkoušel tento kryptojazyk použít a důrazně vyzývám všechny, aby si před komunikací se mnou zjistili anglickou podobu, chtějí-li se vyhnout mému podezření, že jsou marťani.

Osobně mi jako výrazně lepší nápad pro jazykově méně vybavené přišel nástroj CLIP (Captions Language Interface Pack) pro VS2008, který zobrazoval překlady až na najetí myši na danou část UI.

Notes on VS2010 Advanced Debugging

Koukám na zajímavou session (sérii) na téma Techniques on Advanced Debugging a nedá mi to, abych si z toho neudělal pár „účastnických“ poznámek pro mé kolegy. No a když už si je píšu, tak je dávám k dispozici, třeba to někomu přijde vhod:

Doporučuje se
  • Vypnout přepínač „Just my code“ v Options/Debugging (umožní ladit i Release code a spoustu dalších věcí, které jinak nejsou možný)
  • Vypnout přepínač „Enable the Visual Studio hosting process“ (= MyApp.vshost.exe, slouží ke zrychlení zavádení procesu, ale má i nepříjemné side effecty)
Triky
  • pomocí Open Project/Solution se dá otevřít .EXE (!!) soubor a následně ho debuggovat (až už F5 nebo Attach to process)
    • chce to mít .PDB soubory symbolů
    • v Properties od solution se dá nastavit v Debug Source Files, kde jsou zdrojáky, pokud nenastavím a nenajde je v původní cestě dle PDB souboru, tak se zeptá na cestu během ladění (pokud mu ji nedám, udělá disassembly do MSIL)
  • v Call Stacku lze nastavit Break Point (F9), který se nastaví při návratu na dané místo
  • lze nastavit Break Pointy pouze na některou část řádku (např. v cyklech for/foreach/do-while zvlášť na vstup do cyklu, zvlášť na inicializaci, zvlášť na vyhodnocení podmínek, atp.); stačí pravým/F9 kliknout na danou část řádku a vložit BP tam
  • Pokud dělám in-line watch (data tip) a zobrazené hodnoty mi překrývají kód, který chci vidět, stačí zmáčknout Ctrl a dokud ho držím, potom watch-box zprůhlední
  • v in-line watch-boxu (data tip) se dá pravým tlačítkem vyvolat contextové menu a třeba tak přidávat do Watch Window zanořená pole, která chci sledovat
  • v in-line watch-boxu (data tip) se dají hodnoty editovat (měnit za běhu hodnoty proměnných), stejnětak ve Watch panelu 
  • do Watch Window se dají přidávat řádky (výrazy) drag&dropem z kódu
  • v Immediate Window se dá během přerušení debuggeru spouštět vlastní kód, vyhodnocovat metody, atp., zahájíme-li řádek otazníkem, dostáváme hodnotu výrazu
  • Make Object ID (pravým na data tip/watch) – objekt dostává referenční číslo (např. „1#“) a je pak možné sledovat jeho hodnotu i mimo původní scope viditelnosti a třeba udělat i instanční podmínku „this == 1#“ do Breakpoint Condition, nebo se dozvědět o tom, že byl garbage-collected (stále observuji určitou referenci v paměti, něco jako WeakReference)
  • ve Watch Window můžu používat pseudo-variables
    • $user – aktuální identita threadu + processu
    • $exception – aktuální výjimka
  • Set Next Statement – pokud debuguji, tak mi žlutě svítí řádek, který se má jako další vykonat, vlevo od něj je žlutá šipka, pokud tuhle šipku přetáhnu na jiný řádek, přesune se mi vykonávaný kód tam (aniž by mezi tím bylo cokoliv spuštěno, prostě takový jump do neznáma, obvykle se může hodit, pokud chceme něco přeskočit); skákat se dá nejenom dopředu, ale i dozadu
  • Remote Debugging je stále omezen na tutéž doménu nebo two-way trust
Tipy
  • pokud Visual Studio dělá ptákoviny, padá na určitém projektu, nechce ho debuggovat, nebo ignoruje Break Pointy, potom stojí za zkoušku smazat (nebo alespoň na zkoušku někam přesunout) soubor .suo (uživateské nastavení solution, hidden file ve stejné složce jako .sln), nemusí to být ono, ale občas se stane, že se tenhle soubor poruší a pak se může dít výše uvedené (nejdřív samozřejmě zkusit restart VS, popř. PC)

MSBuild na x64 nepracuje správně s Code Contracts + how to fix (Updated)

Máte-li samostatný build-server na x64 platformě, na něm nainstalované Code Contracts a pouštíte 64-bitový MSBuild, potom rychle zjistíte, že takový build ignoruje Code Contracts.

Problém je v tom, že do msbuildu se nanaimportují targets pro Code Contracts (C:\Program Files (x86)\Microsoft\Contracts\MsBuild\v3.5\Microsoft.CodeContracts.targets), protože Code Contracts se nainstalují do „Program Files (x86)“ složky, kdežto 64-bitový MSBuild si nastaví property MSBuildExtensionsPath na „Program Files“ a tam Code Contracts nainstalované nejsou.

Microsoft.CodeContracts.targets se dostávají do MSBuildu přes Custom.After.Microsoft.Common.targets, které se linkují z Microsoft.Common.targets – tam je však cesta k nim sestavena přes property MSBuildExtensionsPath a ta má pro 64-bitový MSBuild hodnotu „C:\Program Files\MSBuild\“ a ne „C:\Program Files (x86)\MSBuild\“.

Problém se dá vyřešit buď používáním 32-bitového MSBuildu, nebo násilným přepsáním hodnoty MSBuildExtensionsPath na „C:\Program Files (x86)\MSBuild\“ v souboru c:\Windows\Microsoft.NET\Framework64\v3.5\Microsoft.CodeContracts.targets takto:

<PropertyGroup>

    <!-- HAVIT: Workaround oprava ConnectID 109232 -->
    <MSBuildExtensionsPath>C:\Program Files (x86)\MSBuild\</MSBuildExtensionsPath>
    <!-- HAVIT: end -->

<CustomBeforeMicrosoftCommonTargets Condition="'$(CustomBeforeMicrosoftCommonTargets)'==''">$(MSBuildExtensionsPath)\v3.5\Custom.Before.Microsoft.Common.targets</CustomBeforeMicrosoftCommonTargets>
<CustomAfterMicrosoftCommonTargets Condition="'$(CustomAfterMicrosoftCommonTargets)'==''">$(MSBuildExtensionsPath)\v3.5\Custom.After.Microsoft.Common.targets</CustomAfterMicrosoftCommonTargets>
<ReportingServicesTargets Condition="'$(ReportingServicesTargets)'==''">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\ReportingServices\Microsoft.ReportingServices.targets</ReportingServicesTargets>
</PropertyGroup>

Problém samozřejmě může nastat, až jiné build-extense než Code Contracts použijí C:\Program Files\MSBuild\ a celé se to rozjede.

Dle hlášeného bugu na Connectu však stejný problém je i s WCF, takže si myslím, že soudruzi v Microsoftu někde přecijenom dělají chybu.

Web Deployment Project + Update

Prakticky identický problém jsem řešil s beta verzí Web Deployment Projectu pro VS2010, nakonec jsem se vykašlal na úpravy souborů a prostě jsem sesynchronizoval obsah C:\Program Files\MSBuild\ se složkou C:\Program Files (x86)\MSBuild (překopíroval jsem jedno přes druhé a vice versa).

Nyní s vydáním RTW verze Web Deployment Projectu jsem si všimnul, že je toto již řešeno použitím propert $(MSBuildExtensionsPath32), která vede do správného místa. V Code Contracts by tedy mělo stačit změnit „všechny“ $(MSBuildExtensionsPath) na $(MSBuildExtensionsPath32), ale nezkoušel jsem to zatím.

TransformXml – MSBuild task pro transformaci XML souborů ála web.config transformace (XDT)

Uff, dalo mi hodně práce vymyslet titulek tohoto článku, aby alespoň trochu vyjadřoval, co článek popisuje – tedy jak pomocí nové techniky Visual Studia 2010 pro web.config transformace, tedy pomocí transformačních XDT souborů (XML Document Transformation Engine), transformovat libovolný jiný XML soubor jako součást běžného buildu.

Pokud nevíte, jak fungují ve Visual Studiu 2010 transformace web.config souborů při deploymentu, podívejte se na můj screencast na MSTV (12:48 minut) nebo na materiály z prezentací (vč. demokódu). Pokud Vás zajímá, jak tímto způsobem transformovat libovolný jiný XML soubor (ať už .config, .sitemap, nebo jakýkoliv jiný .xml), potom čtěte dále.

TransformXml MSBuild task

Celé kouzlo spočívá ve využití připraveného TransformXml MSBuild tasku, který je použit i v připraveném targetu TransformWebConfig používaném při deploymentu webových aplikací (vytváření Package). Task TransformXml je prostý, má tři parametry a vypadá takto:

<TransformXml Source="path/original.xml" Transform="path/transformation.xml" Destination="path/transformed.xml" />

Abyste však tento task mohli použít v libovolném projektovém (.csproj, .vbproj, …) souboru (nejenom tedy webu, ale i ConsoleApplication, ClassLibrary, či čehokoliv jiného mimo WebSite), musíte jej importovat instrukcí using z assembly webového deploymentu:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>

No použít task můžete samozřejmě v rámci libovolného targetu, celé to pak může v .csproj souboru vypadat takto:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
<Target Name="AfterBuild">
    <TransformXml Source="Menu\default.xml" Transform="Menu\MyTransform.xml" Destination="Menu\MyMenu.xml" />
</Target>

Target AfterBuild je připravený a automaticky spouštěný po základním buildu projektu. Znáte-li fungování projektových souborů a MSBuildu, dále číst nemusíte.

Editace projektových souborů (.csproj/.vbproj/.*proj)

Projektové soubory, jak je znáte z Visual Studia, nejsou ve skutečnosti nic jiného, než MSBuild instrukční soubory, které nejenom drží pohromadě konfiguraci Vašeho projektu, ale představují především zadání pro MSBuild, jak má Vás projekt v různých situacích buildovat.

Nebojte se tedy s těmito soubory pracovat a editovat je! Nejedná se o žádné hackování Visual Studia, ale o zamýšlený způsob ovládání Microsoftího build-procesu. Visual Studio pro Vás tyto soubory typicky založí, během práce s projektem je aktualizuje, nicméně je nepřegenerovává, ale pouze edituje a je opravdu na Vás, pokud chcete buildování Vašeho projektu nějak obohatit, abyste s těmito XML soubory pracovali.

Podrobnější popis fungování těchto souborů je mimo rozsah tohoto článku, pro začátek Vám však značí znát pojmy jako target a task.

MSBuild task je primitivní úkon, který má MSBuild během své práce vykonat. Např. něco zkompilovat, smazat, zkopírovat, založit složku, zkomprimovat do ZIP souboru, transformovat XML, atp. V projektovém souboru se zapisuje jako XML emelent a jeho nastavení se provádí pomocí atributů, viz např. výše uvedený TransformXml task. Základní sada tasků je v MSBuild integrována, další lze připojit jako doplňky (viz výše uvedený Using, který zavádí task TransformXml z .NET assembly).

MSBuild target je něco jako procedura, sada tasků nebo jiných targetů, které se mají vykonat. Pokud např. Visual Studio builduje Váš projekt, volá target „Build“, při publishingu webových aplikací se používají targety jako „CreatePackage“ nebo „TransformWebConfig“. Výchozí konfigurace zahrnuje speciální template-targety „BeforeBuild“, „AfterBuild“ a podobné, kam se snadno můžete zapojit se svými tasky při běžných buildech.

No a to co my ve skutečnosti při výše uvedených transformacích XML souborů děláme, je ve skutečnosti to, že do targetu AfterBuild přidáme task TransformXml (před tím zavedený pomocí Using), který v patřičné fází buildu transformaci provede.

Jak na editaci projektových souborů z Visual Studia:

  1. Projekt, do jehož projektového souboru budete zasahovat, je zpravidla potřeba „unloadovat“ (jen málokterý projektový soubor lze editovat, pokud je projekt zaveden, např. u .wdproj Web Deployment Projectu to lze). V Solution Exploreru tedy pravým tlačítkem klikneme na projekt a dáme „Unload project“ (unloadovaný project se sbalí a zašedne).
  2. Nyní můžeme v Solution Exploreru pravým tlačítkem na projekt a dát „Edit project file“
  3. V typickém projektovém souboru najdete targety AfterBuild a BeforeBuild jako připravené zakomentované XML elementy (odkomentujte!), obvykle někde ke konci souboru (na začátku je zpravidla nastavení projektu, uprostřed používané soubory, ke konci buildové věci):
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->

4.  Po potřebných úpravách souboru a jeho uložení stačí opět dát pravým na projekt v Solution Exploreru a „Reload Project“.

5.  Nyní můžete buildovat…

Pokud zapomenete udělat Reload Project, projekt se Vám bude při buildu ignorovat, což nemusí být hned zjevné.

No files were found to look in. Find was stopped in progress. (Hledání v souborech, VS 2008)

Při pokusu o hledání v souborech se mi zobrazuje hláška: No files were found to look in. Find was stopped in progress.
Říkám si hmm, asi bug. Restartuju Visual Studio a bude vyřešeno.
Restart nepomohl.
Chvilku googluju a nacházím návod, který (stejně jako autor článku) zařazuji kategorie „Kdybych to neviděl, tak bych tomu nevěřil.“ Cože? Zmáčknout Ctrl+ScrollLock a začne to fungovat? Skutečně! Neuvěřitelné. Co to je? Jak na to někdo přišel? Smekám…

UPDATE: Ve VS 2010 (x64) mi se stejným problémem právě pomohl stisk samotné klávesy Break/Pause.

Fiddler: Zachytávání lokálního ASP.NET Web Development Serveru (aktualizováno)

Fiddler je výborný nástroj pro zachytávání HTTP provozu – zobrazí Vám přesnou podobu HTTP requestu a responsu, kterou Váš počítač dělá vůči webovým serverům.

Ve skutečnosti Fiddler funguje jako proxy-server. Při spuštění se nastaví v Internet Options jako proxy a veškeré běžné požadavky tak jdou přes něj. Problém je v tom, že ne zas tak úplně veškeré, Innternet Explorer i .NET Framework natvrdo směřují veškeré požadavky na „localhost“ a „127.0.0.1“ mimo proxy, přestože je proxy zapnutý i pro intranet.

První podmínkou pro zachytávání Fiddlerem je tedy používat pro browsing adresu v podobě http://mujpocitac:1234/MyPage.aspx, čímž jdou takové požadavky přes proxy a dostane je Fiddler.

Další problém je však v tom, že ASP.NET Web Development Server (Visual Studio, Web Developer Express, …) přijímá požadavky pouze na „localhost“ a ostatní zamítá.

Řešením je překlad adresy ve Fiddleru. Fiddleru můžeme přidat pravidlo, aby požadavky na „mujpocitac“ převáděl na podobu „localhost“. Do CustomRules.js (Rules ~ Customize rules…) přidáme na začátek události BeforeRequest:

static function OnBeforeRequest(oSession:Fiddler.Session)
{
    oSession.host = oSession.host.replace("mujpocitac", "localhost");
}

…a je to.

(Samozřejmě ten překlad by se dal udělat i odolnější, aby fungovaly i adresy http://mujpocitac/mujpocitac/mujpocitac.aspx a nebylo z nichhttp://localhost/localhost/localhost.aspx)

Update pro Windows Vista

Ve Windows Vista je mimo výše uvedeného potřeba ještě ve Fiddleru v Options vypnout volbu „Enable IPv6“.

Visual Studio Gallery – katalog doplňků pro VS

Microsoft připravil nový web, Visual Studio Gallery (http://visualstudiogallery.com), který má být katalogem všech možných doplňků pro Visual Studio, extenzí, add-inů, maker a podobných vylepšení. Zaregistrovat se můžete i se svými doplňky.

Znali jste například následující zajímavé bezplatné nástroje?