Bartek Szafko

all of the bits and pieces

Instalator w pliku msi część 5 – skróty

with 13 comments

W poprzednich częściach o WiX:

 

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?

Written by Bartłomiej Szafko

February 16th, 2009 at 9:10 pm

Posted in WiX

with 13 comments to “Instalator w pliku msi część 5 – skróty”

Subscribe comments with RSS. TrackBack URL.

  1. Tom

    17 Feb 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

  2. Darek Tarczyński

    1 Mar 09 at 21:41

    Kurka, czego to w tym Wixie nie ma… :-)

  3. Dawid Węgrzyn

    10 Apr 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

  4. Bartek Szafko

    11 Apr 09 at 08:56

    spoko dojdę i do tego na razie drapiemy tylko po powierzchni ;)

  5. Artur

    2 Dec 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.:

  6. Artur

    2 Dec 09 at 12:07

    dalsza część pytania:

  7. 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?

  8. Artur

    3 Dec 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.

  9. Artur

    3 Dec 09 at 00:32

    Dzięki za wcześniejszą odpowiedź!

  10. 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!

  11. Artur

    4 Dec 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.

  12. Artur

    4 Dec 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.

Leave a Reply