2012-06-20 11 views
14

Mam obecnie dwa instalatory WIX dla produktu, który utrzymuję. Jeden dla 32-bitowych systemów operacyjnych i jeden dla 64-bitowych systemów operacyjnych. Zamiast utrzymywać dwa oddzielne instalatory, chcę połączyć je w jeden instalator NSIS, który może "określić" "bitness" systemu operacyjnego, a następnie skopiować odpowiednie pliki binarne do katalogu programu. Czy ktokolwiek miał z tym jakieś doświadczenie i mógł dostarczyć działającego przykładowego skryptu, którego NSIS może użyć do utworzenia instalatora?Użyj jednego instalatora NSIS do zainstalowania 32-bitowych plików binarnych w 32-bitowym systemie operacyjnym i 64-bitowych plikach binarnych w 64-bitowym systemie operacyjnym?

Odpowiedz

11

x64.nsh ma pewne makra pomocnika i można zainstalować na $programfiles32 lub $programfiles64

EDIT:

Function .onInit 
StrCpy $instdir $programfiles32\MyApp 
${If} ${RunningX64} 
    StrCpy $instdir $programfiles64\MyApp 
${EndIf} 
FunctionEnd 

... 

Section 
Setoutpath $instdir 
${If} ${RunningX64} 
    File /r build\64\* 
${Else} 
    File /r build\32\* 
${EndIf} 
SectionEnd 
+0

zrobiłem spojrzeć na to i to pozwala mi określić bitness systemu operacyjnego, ale wciąż napotkasz problem, gdy trzeba powiedzieć instalatora który Pliki do zainstalowania. Obecnie mam jedną "sekcję", która zawiera to: 'SetOutPath $ {PROGRAMINSTALL} Plik/r build \\ *' Więc nie jestem pewien, czy moduł x64 pomógłby w tej sytuacji ... –

+0

nie instaluję 32-bitowych plików binarnych w 64-bitowym systemie ... Instaluję 64-bitowe pliki w 64-bitowych systemach operacyjnych i 32-bitowe pliki w 32-bitowych systemach operacyjnych ... –

+0

@JulianEasterling to mówi system, który pliki do zainstalowania. Jeśli umieścisz pliki 64-bitowe w plikach 'build \ 64' i pliki 32-bitowe w' build \ 32'. Jeśli musisz zmienić katalog instalacyjny w zależności od architektury, możesz umieścić 'SetOutPath' wewnątrz If/Else – icc97

4

Wierzę, że zorientowaliśmy się ... Nie testowałem tego jeszcze, ale powinno działać ...

Odpowiedź jest taka, aby utworzyć dwie "sekcje" dla każdego zestawu plików. SEC0000 dla plików 32-bitowych i SEC0001 dla plików 64-bitowych. Następnie

!include x64.nsh 

Function .onInit 
    #Determine the bitness of the OS and enable the correct section 
    ${if} ${RunningX64} 
    SectionSetFlags ${SEC0001} 17 
    SectionSetFlags ${SEC0000} 16 
    ${else} 
    SectionSetFlags ${SEC0001} 16 
    SectionSetFlags ${SEC0000} 17 
    ${endif} 
FunctionEnd 

Wierzę, że ta sama logika będą potrzebne w funkcji un.onInit zbyt więc Uninstaller wie, które pliki usunąć ...

+1

Użyj makr pomocniczych w sekcje.nsh, aby wybrać/odznaczyć sekcje ... – Anders

4

Dla prostego uniwersalnego instalator 3.0a0, że znajdując małe eksperymenty, które zadziałało dla mnie:

!include x64.nsh 
Function .onInit 
    #Determine the bitness of the OS and enable the correct section 
    ${If} ${RunningX64} 
    SectionSetFlags ${SEC0000} ${SECTION_OFF} 
    SectionSetFlags ${SEC0001} ${SF_SELECTED} 
    ${Else} 
    SectionSetFlags ${SEC0001} ${SECTION_OFF} 
    SectionSetFlags ${SEC0000} ${SF_SELECTED} 
    ${EndIf} 
FunctionEnd 

Po prostu musiałem pamiętać o umieszczeniu funkcji po przywołanych sekcjach. Każda z moich sekcji odwoływała się do tego samego pliku .exe o tej samej nazwie w swoich 32-bitowych/i 64-bitowych/katalogach, więc mój deinstalator nie wymagał specjalnego traktowania. Nie testowałem tego w systemie 32-bitowym, ale działało to w systemie 64-bitowym.

Przykład:

section "64-bit" SEC0001 
    messageBox MB_OK "64-BIT!" 
    File "C:\foo\64-bit\some-utility.exe" 
sectionEND 
+0

do tego będziesz potrzebować' ! include "Sections.nsh" 'w twoim skrypcie, ponieważ wybrane' SF_SELECTED' jest częścią 'Sections.nsh' – icc97

Powiązane problemy