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

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?

16 thoughts on “Instalator w pliku msi część 5 – skróty

  1. Tom says:

    Witaj,

    Czy mógłbyś się skontaktować ze mną w sprawie nagrody w konkursie Polishwords? Nie mogę się z Tobą skontaktować.

    pozdrawiam

  2. Kurka, czego to w tym Wixie nie ma… 🙂

  3. Dawid Węgrzyn says:

    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. spoko dojdę i do tego na razie drapiemy tylko po powierzchni 😉

  5. Artur says:

    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 says:

    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 says:

    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 says:

    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 says:

    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 says:

    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.

  13. Witam Pana,

    Bardzo fajny blog.
    Przeczytałem pięć pierwszych części dotyczących WIX. -TYLKO TYLE MI BYŁO POTRZEBNYCH NA RAZIE.
    Są dobrze opisane, ale są małe szczególiki niedopowiedzenia, np.: czy trzeba do resource wix dodać projekt, wydaje mi się, że nie, np.: nie było kodu do pobrania dla sprawdzania wersji net (było tylko na youtube), itd.

    Ale są to drobnostki na moim blogu też występują to naturalne.

    Kiedyś czytając SDJ natknąłem się na Pana artykuł właśnie dotyczący instalek teraz miałem potrzebę i skorzystałem super.

    JEDNA TYLKO UWAGA: KIEDY MOŻNA SIĘ SPODZIWAĆ OPISU INSTALACJI BAZ DANYCH MySQL i MSSQL.
    Bo to by na Pana blogu się przydało – i w zasadzie to jest sedno tworzenia instalek.

    Poz,
    Marek Bilski
    katmpbsoft.blogspot.com

  14. Dzieki za mile slowa – milo ze nadal ktos czyta te stare posty 🙂

    Na razie zupelnie porzucilem temat WiX – zmiana obowiazkow w pracy itp…

  15. Piotr says:

    Bardzo fajny blog. Szkoda tylko że tak mało aktualizowany 🙂 Również dołączam się do prośby o instalację MSSQL (instancji).

Leave a Reply

Your email address will not be published. Required fields are marked *