Instalator w pliku msi część 5 – skróty
W poprzednich częściach o WiX:
- część 1 – wstęp teoretyczny o instalatorach
- część 2 – pierwszy instalator
- część 3 – dodanie interfejsu użytkownika
- część 4 – customizacja interfejsu użytkownika
W tej części omówie możliwości WiX jeśli chodzi o tworzenie skrótów do naszej aplikacji z menu start oraz pulpitu.
W instalatorach możemy tworzyć dwa rodzaje skrótów advertised i unadvertised.
Advertised
Skróty tego typu mogą się odwoływać tylko do plików, które są częścią instalatora. Za to podlegają np.: procesowi naprawy. Mogą być osadzone bezpośrednio w komponencie, który zawiera plik do którego mają wskazywać.
Przy okazji – jako best practice mogę polecić trzymanie struktury folderów i komponentów osobno – dzięki temu łatwiej będzie zmieniać lokalizację komponentów.
Poniżej przykład stworzonych skrótów typu Advertised(kluczowy jest element Shortcut oraz atrybut Advertise):
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="D_INSTALLLOCATION" Name="$(var.Manufacturer) $(var.ProductName)"/>
</Directory>
<Directory Id="DesktopFolder"/>
<Directory Id="ProgramMenuFolder">
<Directory Id="D_MenuStartManufacturer" Name="$(var.Manufacturer)">
<Directory Id="D_MenuStartProduct" Name="$(var.ProductName)"/>
</Directory>
</Directory>
</Directory>
<DirectoryRef Id="D_INSTALLLOCATION">
<Component Id="C_ProductComponent" Guid="0c8acba5-46b2-472a-ab89-771dda833ab7">
<File Id="F_c2csiexe" Source="$(var.SolutionDir)c2csi\bin\$(var.Configuration)\c2csi.exe" KeyPath="yes">
<Shortcut Id="S_MenuStartShortcut" Name="C2C" Advertise="yes" Directory="D_MenuStartProduct" Icon="I_c2csi.exe"/>
<Shortcut Id="S_DesktopShortcut" Name="C2C" Advertise="yes" Directory="DesktopFolder" Icon="I_c2csi.exe"/>
</File>
</Component>
</DirectoryRef>
<Icon Id="I_c2csi.exe" SourceFile="$(var.SolutionDir)c2csi\bin\$(var.Configuration)\c2csi.exe"/>
Przy okazji mała ciekawostka – okazało się że nazwa Id zdefiniowanej ikony musi kończyć się .exe tak jak plik do którego wskazuje skrót. Z innych ciekawostek – na Viście miałem problem z usuwaniem folderów z menu start, musiałem dodać fake komponent, który zadziałał przy usuwaniu:
<DirectoryRef Id="D_MenuStartProduct">
<Component Id="C_FakeMenuStart" Guid="92476C56-1D38-4b5e-97E7-E83F5E9917C9">
<RegistryKey Root="HKCU" Key="Software\$(var.Manufacturer)\$(var.ProductName)\Uninstall">
<RegistryValue Value="Fake" Type="string" KeyPath="yes"/>
</RegistryKey>
<RemoveFolder Id="R_MenuStartManufacturer" Directory="D_MenuStartManufacturer" On="uninstall"/>
<RemoveFolder Id="R_MenuStartProduct" Directory="D_MenuStartProduct" On="uninstall"/>
</Component>
</DirectoryRef>
Powyższe przykłady dodadzą, skróty dla aktualnie zalogowanego użytkownika, natomiast jeśli chcemy dodać je dla wszystkich użytkowników ( do profilu All Users) wystarczy tylko dodać:
<Property Id="ALLUSERS"><![CDATA[2]]></Property>
Unadvertised
Skróty tego typu mogą sie odwoływać do dowolnego pliku w systemie, z tym że nie podlegają już mechanizmowi naprawy instalacji. Trzeba też tworzyć osobny komponent dla tych skrótów i stworzyć element keypath, po których silnik instalacji sprawdzi czy dany komponent jest zainstalowany – musi to być to wpis w rejestrze systemowym, a nie plik tak ja w poprzednim przykładzie.
<DirectoryRef Id="D_MenuStartProduct">
<Component Id="C_UnadvertisedShortcuts" Guid="2CBF2F3D-1B06-4102-A8A4-963E49FEADF3">
<RegistryKey Root="HKCU" Key="Software\$(var.Manufacturer)\$(var.ProductName)\Uninstall">
<RegistryValue Value="UnadvertisedShortcuts" Type="string" KeyPath="yes"/>
</RegistryKey>
<Shortcut Id="S_MenuStartUnadvertisedShortcut" Name="C2C" Advertise="no" Target="[#F_c2csiexe]" Directory="D_MenuStartProduct" Icon="I_c2csi.exe"/>
</Component>
</DirectoryRef>
Metodę unadvertised zastosujemy np.: w sytuacji gdy chcielibyśmy dodać skrót do odinstalowania aplikacji w menu start.
Pomysły
Tak się zastanawiam, czy może na lato nie byłoby warto przgotować warsztatów z WiX – czy wogóle byliby jacyś chętni, jak myślicie?
Tom
17 lut 09 at 23:51
Witaj,
Czy mógłbyś się skontaktować ze mną w sprawie nagrody w konkursie Polishwords? Nie mogę się z Tobą skontaktować.
pozdrawiam
Darek Tarczyński
1 mar 09 at 21:41
Kurka, czego to w tym Wixie nie ma…
Dawid Węgrzyn
10 kwi 09 at 12:13
Cała seria Twoich tutoriali o Wix jest bardzo fajna i przystępna. Jeżeli mogę coś zaproponować to przydałby się tutorial o Wix + wykrywanie/instalcji bazy danych (najlepiej MS SQL)
)).
Pozdrawiam
Bartek Szafko
11 kwi 09 at 08:56
spoko dojdę i do tego na razie drapiemy tylko po powierzchni
Michal Chmielus
8 cze 09 at 14:15
mozesz zerknac np tutaj:
http://www.codeproject.com/KB/database/LocatingSql.aspx?display=PrintAll&fid=30622&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26
Artur
2 gru 09 at 12:06
Witam,
Tutoriale są bardzo ciekawe i fajne. Ale czy da się za pomocą setapu w WIX uruchomić aplikację w trybie WixUI_Minimal. Aplikacja znajduje się w tym samym katalogu co plik setup.msi, a nie w katalogu:”INSTALLLOCATION” .
Czy jest jakiś alias dla katalogu “CurrentDirectory” w takim znaczeniu że “CurrentDirectory” to katalog w którym znajduje się setup setup.msi??
np.:
Artur
2 gru 09 at 12:07
dalsza część pytania:
Bartłomiej Szafko
2 gru 09 at 19:04
dzięki za wsparcie – zawsze usłyszeć miłe słowa.
Odnośnie twojego pytania:
1. normalnie Windows Installer odwołuje się do plików tylko w obrębie instalatora – najprostszym wyjściem byłoby dołączenie pliku, który chcesz uruchomić do msi, uruchomienie( za pomocą custom action) go z lokalizacji docelowe INSTALLLOCATION. Można poczekać na zakończenie i wtedy usunąć.
2. Można by próbować zrobić to za pomocą jakiegoś dziwnego custom action – np wykonanie batcha – trzeba to potestować.
A spytam tak pomocniczo – po co konkretnie chcesz coś takiego robić ? Jaki jest cel?
Artur
3 gru 09 at 00:31
Chcę uruchomić kilka instalatorów jeden po drugim. To są instalatory msi. Można tylko jeden w jednym czasie odpalić i nie mogę tego zrobić z instalatora msi. Chciałbym użyć aplikacji którą uruchomi WIX. Ok wiem jak to zrobić w folderze INSTALLLOCATION. Z tym że wtedy spakuje mi te instalatory w jeden cały duży plik. Wolałbym mieć je osobno na dysku. Zanim zacznę instalację chcę jeszcze sprawdzić Net. 2 i IIS oraz WinInst 3.1.
Artur
3 gru 09 at 00:32
Dzięki za wcześniejszą odpowiedź!
Bartłomiej Szafko
3 gru 09 at 10:52
uruchamianie msi z innego msi jest zabronione ( teoretycznie możliwe ale niezgodne z konwencją).
Spójrz na temat bootstrappera:
http://bartekszafko.pl/2009/06/22/instalowanie-komponentw-zaleznych/
koniecznie przeczytaj też komentarze!
Artur
4 gru 09 at 12:12
Dzięki za odpowiedź! Bootstrapper jest prostym i ciekawym rozwiązaniem. Już wcześniej widziałem ten przykład ale jakoś nie widziałem w tym rozwiązania problemu. Twoja sugestia przekonała mnie do zapoznania się z tym przykładem szczegółowo. Dzięki za pomoc.
Artur
4 gru 09 at 12:15
Jeśli mogę spytać, to jaki sposób można wykorzystać do sprawdzania zainstalowanych składników, ale z uwzględnieniem KOLEJNOŚĆ ich sprawdzania? Powiedzmy że ważna jest tylko kolejność 2 składników więc można by wykorzystać jakieś 2 metody sprawdzania.