WiX 3.0 jest, 3.5 nadchodzi
Jak już pewnie wiecie wersja 3.0 Windows Installer Xml jako stabilna. Oznacza to, że nie będzie już żadnych rewolucyjnych zmian w drzewie 3.0 poza poprawkami krytycznych błędów. Numer builda to 3.0.5419.0. Więcej można przeczytać na blogu Roba.
Wersja 3.5
Teraz rozpoczęły się pracę nad wersją 3.5 WiX, głównym dodatkiem będzie Burn, czyli bootstrapper(chainer) dla msi. Z tego co pisał Rob na swoim blogu wynika, że będzie można zupełnie ukryć windows installera pod swoim własnym wyglądem. Będzie można też prosto instalować pakiety zależne, a nawet je ściągnąć z sieci. Będzie wreszcie elegancki sposób na zastąpienie własnych bootstrapperów – tak jak to opisałem w jednym z poprzednich wpisów. Więcej o burn można znowu poczytać na blogu Roba.
Jako mały test zainstalowałem już wersję 3.5, działa zupełnie poprawanie, oglądałem też sposób generowania bootstrappera za pomocą manifestów xmlowych i spróbuje go użyć jak tylko wyjdzie jakaś w miarę stabilna wersja burna. Przy okazji stworzyłem instalator dla BlipFace (wpfowego klienta dla blipa), jest do znalezienia na githubie. Tak na marginesie to było moje pierwsze użycie gita muszę przyznać że filozofia odrobinę inna niż w svn, ale udało mi się szybko dostosować.
Mono i CAB
Mono to otwarta implementacja środowiska .NET tworzona przez Novella – działa na linuxach i mac os.
Z ostatnich wiadomości: Microsoft obiecał, że nigdy nie będzie ścigał projektu mono o licencję, można przeczytać o tym na blogu Miguela, to może umocnić pozycję tego projektu, do tej pory niespecjalnie było wiadomo czy MSFT pozwie novella i zmusi do zamknięcia, więc raczej nie podchodziłem do projektu na 100% poważnie.
W Mono niestety nie uświadczysz WPF czy WCF, ale jest za to asp .net MVC. Jest też prawie 100% zgodność z Winsforms. Język C# jest w wersji 3.0 i obsługuje LINQ.
Dla Mono jest coś co się nazywa Mono Migration Analyzer (MoMA) – pozwala na sprawdzenie w jakim stopniu aplikacja będzie się uruchamiać na mono.
Wszystko fajnie, ale postanowiłem spróbować jak to wygląda w rzeczywistości na bardziej zaawansowanych aplikacjach. Wziąłem Smart Client Software Factory w wersji z kwietnia 2008, a konkretnie Quickstarts.BankTeller i przepuściłem przez MoMA, oto co dostałem:
Czyli w sumie nie jest źle! Dokładniejszy raport wygląda tak:
Pierwsza z uwag jest spowodowana tym, że w aplikacji jest wywoływana przeglądarka internerowa, której brakuje w Mono – co w sumie jest OK. Drugi brak już jest poważniejszy, ale z tego co kojarze jest w kolejce do zrobienia.
Czyli w sumie powinno się udać uruchomić aplikację w SCSF na linuxie – hmm to otwiera całkiem ciekawe możliwości. Teraz tylko muszę wybrać jakąś dystrybucję ( czy Polish Linux Distribution jeszcze żyje?) zainstalować na wirtualce i sprawdzić jak to działa w praktyce.
PS: Ostatnio pojawił się także ciekawy podcast Scotta Hanselmanna w tym temacie – do posłuchania tutaj.
Malta Festiwal 2009 – subiektywne podsumowanie
W tym roku całkiem niezły wynik – z planowanych 7 spektakli zobaczyłem 4. Na Ba-ku Schron niestety nie udało się już dostać biletów, na pozostałe już mi się nie chciało iść, ale ogólnie można przyznać że się odchamiłem
Nie jestem krytykiem, ale pokuszę się o moją własną opinie.
Teatr USTA USTA – Aleksandria
Jak zwykle się nie zawiodłem, miejsce bardzo fajne – stary Stadion Warty. Do tego muzyka na żywo, rzecz rzadko spotykana. Spektakl bardzo dynamiczny cały czas się wszystko ruszało.
Kompania Doomsday – Mewa
Mewa autorstwa Czechowa oczywiście. 4 aktorów zupełnie niespodziewana i żywiołowa forma, tylko to rosyjska recytacja mnie zabiła totalnie nie wiedziałem o co chodzi. Wnętrze też bardzo interesujące – jedna z hal starej rzeźni.
Asoscja 2006 – Rabin Mahral i Golem
Niestety bez zdjęć. Dosyć kontrowersyjne. Przy okazji dowiedziałem się, że rabin Mahral z Pragi, który stworzył Golema był z Poznania
Teatr Porywaczy Ciał – More Heart Core
Ten spektakl podobał mi się najbardziej. Wpierw dostaliśmy jedzenie dla psów do misek, później poleciała wiązanka przekleństw i wielka rozpierducha do Slayera puszczonego na cały regulator. A później było miło i przyjemnie: budowaliśmy duże żyrafy i takie mniejsze z plasteliny.
Spektakl bazował luźno na poradniku Marshalla Rosenberga – pt “Porozumiewanie bez przemocy”. Rosenberg wyróżnił dwa sposoby komunikowania się: język szakala: oskarżenia, groźby, obrażanie, etykietowanie, uogólnianie, budzenie poczucia winy, agresja, brak umiejętności aktywnego słuchania oraz język żyrafy: język pełen empatii, miłości, rozwiązywanie konfliktów w sposób pokojowy, okazywanie akceptacji, umiejętność aktywnego słuchania, powstrzymywanie się od oceniania. Naprawdę sporo to dało do myślenia.
Jednym słowem psychoteatr in your face.
Instalowanie komponentów zależnych
O tym, że można wykryć czy .NET albo dowolny inny pakiet jest zainstalowany pisałem w jednym z poprzednich wpisów. Pisałem również, że z poziomu MSI nie można odpalać instalacji innych pakietów.
Dzisiaj pokaże jak szybko stworzyć bootstrappera do plików MSI. W tym celu będę używał bootstrappera znanego z ClickOnce.
Pierwszym krokiem jest wyedytowanie pliku .wixproj i dodanie następującego kawałka kodu:
<ItemGroup>
<BootstrapperFile Include="Microsoft.Net.Framework.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5</ProductName>
<Install>true</Install>
</BootstrapperFile>
</ItemGroup>
<Target Name="AfterBuild">
<GenerateBootstrapper
ApplicationFile="WixProject3.msi"
ApplicationName="WixProject3"
BootstrapperItems="@(BootstrapperFile)"
OutputPath=".\bin\Debug"
ComponentsLocation="Relative"
Culture="en"
Path="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper"
/>
</Target>
I to właściwie wszystko! Po uruchomieniu budowania projektu WiX w folderze bin\Debug znajdziemy setup.exe, który po uruchomieniu sprawdzi i ewentualnie zainstaluje .NET 3.5, a później odpali plik WixProject3.msi.
Zawartość folderu bin\Debug wygląda mniejwięcej tak:
zwróćcie uwagę, że wszystkie pakiety od .neta też wylądowały w tym folderze. Stało się tak ponieważ użyłem ComponentsLocation=”Relative”, ale można również ustawić żeby pobierał się z sieci (więcej o GenerateBootstrapperTask).
Teraz całość (oprócz .wixpdb) możemy zapakować, najlepiej jakiś selfextractorem ( ja lubie iexpress ) i ustawić wywołanie setup.exe po rozpakowaniu. Trzeba tylko uważać na rozmiar, gdy jeszcze dorzucimy crystala i sql może być już całkiem spory.
Przedstawione przezemnie rozwiązanie ma pewne niedogodności:
- boostrapper clickonce nie ma polskiej lokalizacji, jednak stosunkowo prosto można to załatwić tłumacząc odpowiednie pliki xml
- w przypadku jakiś niestandardowych (albo własnych) zależności będziemy musieli je dodać, tak żeby były widoczne w deploymencie clickonce we właściwościach projektu. Na szczęście to też można załatwić w miarę szybko.
Miłej zabawy!
PS. Zastanawiam się, czy by nie opowiedzieć o WiX w ramach Speaker Idola na MTS 2009 – jak myślicie warto ? czy temat zainteresuje publikę ? Na pewno warto zwrócić na niego uwagę szerszej publiczności, bo przez sam Microsoft jest traktowany po macoszemu, pewnie dlatego że jest open source
Mój artykuł o WiX w SDJournal
Miła dla mnie wiadomość na początek czerwca – w numerze 06\2009 Software Developer’s Journal ukazał się artykuł o WiX mojego autorstwa:
Przy okazji małe sprostowanie w momencie pisania artykułu WiX miał być częścią VS 2010 później to się zmieniło.
Jeśli chodzi o zawartość artykułu – to jeśli czytasz regularnie mojego bloga nie będzie w nim dla Ciebie żadnych niespodzianek.
WIX – Wykrywanie zainstalowanych MSI
Czasami przy instalacji trzeba stwierdzić czy zainstalowano już jakiś inny MSI. Może to być .NET, serwer SQL, czy może jakiś zupełnie inny produkt.
.NET
Z samym .NETem sprawa jest dosyć prosta. Wystarczy, że użyjemy biblioteki WixNetFxExtension.dll, która realizuje potrzebną nam funkcjonalność:
<PropertyRef Id="NETFRAMEWORK35"/> <Condition Message=".NET Framework w wersji 3.5 musi być zainstalowany ([NETFRAMEWORK35])"> NETFRAMEWORK35 </Condition>
Użycie PropertyRef jest konieczne, aby zastała zaimportowana odpowiednia wartości Property z WixNetFxExtension.dll. Dalej już jest prosto definiujemy element Condtion w InnerText wpisujemy warunek, który musi być ustawiony na TRUE, aby mogła rozpocząć się instalacja – całość ląduje w tabeli LaunchCondition. Własność NETFRAMEWORK35 jest ustawiona na #1 jeśli jest zainstalowany .NET Framework 3.5 . W NetFxExtension jest ustawianych bardzo dużo własności, które mogą nas poinformować o wersji SP, a nawet czy zainstalowano Client Profile. Pełny opis w c:\program files\Windows Installer Xml v3\doc\Wix.chm – hasło “WixNetfxExtension”.
Inne pakiety
Żeby wykryć inne zainstalowane pakiety można użyć np.: RegistrySearch:
<Property Id="NETFRAMEWORK20"> <RegistrySearch Id="NetFramework20" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" Name="Install" Type="raw" /> </Property>
Co ustawi, własność NETFRAMEWORK20 na wynik wyszukiwania wartości klucza w rejestrze – tak naprawdę taką metodą posługuje się NetFxExtension.
Innną metodą jest wyszukiwanie konkretnego zainstalowanego komponentu za pomocą ComponentSearch:
<Property Id="VS2005PROJECTAGGREGATOR2"> <ComponentSearch Id="VS2005ProjectAggregator2Search" Guid="B0BB80E0-5CCC-474E-A75E-05DC1AE073BC" /> </Property>
Musimy w takiej sytuacji znać Guid komponentu.
Inne możliwości to:
- IniFileSearch – pozwala szukać pliku .ini lub konkretnej jego zawartości, to jest trochę przestarzała metoda, ponieważ tych plików już tak często się nie używa
- DirectorySearch – wyszukiwanie konkretnego folderu
- FileSearch – wyszukiwanie konkretnego pliku
Instalacja zależnych pakietów
W samym pakiecie MSI nie możemy wywoływać instalacji innych pakietów MSI, jest to zabronione. Możemy do naszego instalatora dołączyć tzw. Merge Module, czyli plik z rozszerzeniem .msm, ale takie pliki rzadko są dostarczane przez producentów.
Jedyną skuteczną metodą na zainstalowanie np. .NETa przed instalacją naszej aplikacji jest użycie tzw. MSI chainera, który instaluje pliki .MSI jeden po drugim. Można też posłużyć się czymś bardziej zaawansowanym – bootstrapperem od clickonce. Temat chainera i bootstrappera to sprawa na osobny wpis, a właściwie całą serię.
Malta Festiwal 2009
Już od środy będzie można kupić bilety na przedstawienia Malta Festiwal 2009.
Jak zwykle zabrałem się za planowanie, na które przedstawienia chciałbym pójść i jak co roku jest to droga przez mękę. Program festiwalowy umieszczony na stronie, jest zupełnie nieprzydatny. Spektakle są co prawda wyświetlane według daty i faktycznie stanowią jakąś informację, ale niesposób ułożyć to w całość. Idealnie byłoby mieć osobistego planera – takiego jak zdarzają się przy okazji konferencji, tak żeby można było łatwo stwierdzić czy są jakieś konflikty itp. Potrzebny byłby też orientacyjny czas trwania spektaklu.
Udostępniony dokument pdf z programem też jest jakiś lewy – brak na nim dat w tytułach kolumn, wiem czepiam się.
Design strony też mógłby być trochę wyraźniejszy no i brak RSSa mnie dobija – bo newsletter jakoś mi nie podchodzi, tak też czepiam się.
Tak jak jestem olbrzymim fanem Malty – tak z bólem muszę przyznać, że obecność w Internecie coś im się nie udaje. Wydaje mi się, że dobrze skonfigurowany drupal załatwiłby większość problemów, pozostałby do zrobienia tylko moduł planera. No i oczywiście możliwość blipowania i flakowania
To może być nawet całkiem ciekawa sprawa – chętnie bym się czymś takim zajął, nawet za darmo:)
A teraz co wybrałem… Na mojej prime liście jest 7 spektakli, wszystkie w dosyć dziwnych miejscach:
Tutaj linki do mojego pubicznego google kalendarza na Malta Festiwal:
.
Myślę, że w tym razem będę równie zadowolony i zainspirowany jak w 2008 i 2007 roku. Naprawdę polecam warto być, zobaczyć i przeżyć coś nowego.
Iron Python
O Iron pythonie czytałem już trochę wcześniej, jednak nie miałem okazji go faktycznie spróbować. Okazja na użycie pojawiała się jakiś czas temu – szukałem rozwiązania pozwalającego użytkowniokowi aplikacji mieć wpływ na pewne części aplikacji bez konieczności programowania, ani posiadania środowiska programistycznego. Iron Python nadał się do tego idealnie.
Leon Bambrick ma na swoim blogu świetny przykład:
W pierwszym polu tekstowym wpisujemy skrypt, który ma się wykonać po naciśnięciu GO. W skrypcie mamy dostęp do całego obiektu txt, który jest drugim polem edit – tutaj jest przykład pozwalący na zrobienie UpperCase z zaznaczonego tekstu. Całość można wywołać za pomocą prostych komend:
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = null;
scope = engine.CreateScope();
scope.SetVariable("txt", TargetTextBox);
string code = CommandTextBox.Text.Trim();
ScriptSource source = engine.CreateScriptSourceFromString(code, SourceCodeKind.Statements);
source.Execute(scope);
Jedyną wadą jest zauważalnie dłuższy czas pierwszego uruchomienia w stosunku do pozostałych. Trzeba pewnie będzie zrobić warmup podczas startu aplikacji.
IronPythona można pobrać z codeplex.
No i ciekawostka – instalator pythona jest napisany przy pomocy Windows Installer Xml.
Listonic.pl
Raczej nie piszę o startupach, ale tym razem zrobię wyjątek, bo warto. Listonic.pl to serwis pozwalający na zbudowanie listy zakupów dzielenie jej np. z żoną i umożliwiający dostęp do listy poprzez mobilną przeglądarkę. Autorzy także udostępnili aplikację java na telefony komórkowe, która umożliwia pracę offline.
Co ciekawe serwis jest napisany w asp.net – można to wywnioskować oglądając kod źródłowy strony, jest tam wiele kawałków charakterystycznych dla .neta. Myślę, że może to być ciekawy głos w dyskusji, którą toczyłem jakiś czas temu z Michałem Grzegorzewskim o tym, że startupy raczej trzymają się z daleka od techonologii .net. Oczywiście sama technologia, w której wykonano serwis nie ma większego znaczenia z punktu widzenia użytkowników i biznesu liczy się tylko użyteczność i czy realizuje założone cele.
Autorzy zpewniają, że pracują nad wieloma dodatkami, w tym wersję na Windows Mobile. Postanowiłem ich trochę ubiec i poeksperymentować w .net compact framework stworzyć prototyp możliwej aplikacji, oto moja propozycja:
Interfejs trochę ala iphone, ale myślę, że może zdać egzamin. Projekt bazowałem na Fluid – Windows Mobile .NET Touch Controls Thomasa Gerbera.
Wix – wyświetlanie kopiowanych plików
Nie wiem czy zauważyliście, ale przy domyślnie stworzony instalatorach w WiX okno postępu instalacji nigdy nie wyświetla dokładnie jakie pliki, klucze rejestru są zakładane i kopiowane, wyświetla się tylko dosyć ogólna informacja “Kopiowanie nowych plików”:
Na przykład instalator od resharpera wyświetla bardzo sczegółowe info o tym co się dzieje:
Żeby dodać podobny efekt, musimy zmodyfikować interfejs użytkownika dodać nową kontrolkę i zasubskrybować jej zawartość do zdarzenia ActionData:
<Control Id="ActionData" Type="Text" X="59" Y="165" Width="273" Height="41" Transparent="yes" TabSkip="no"> <Subscribe Event="ActionData" Attribute="Text" /> </Control>
Niby prosta modyfikacja, ale wymaga albo zbudowania WiXa od nowa(chociaż UIExtension) albo dodania całego UI do swojego projektu instalatora – co ma niewątpliwe zalety na przyszłość, będzie można trochę poszaleć i np stworzyć coś podobnego do resharpera. BTW instalator resharpera jest dobrym miejscem do podejrzenia jak zrobić parę ciekawych rzeczy w wix – więc orca w dłoń i do roboty.
