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
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
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ąć ...
Użyj makr pomocniczych w sekcje.nsh, aby wybrać/odznaczyć sekcje ... – Anders
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
do tego będziesz potrzebować' ! include "Sections.nsh" 'w twoim skrypcie, ponieważ wybrane' SF_SELECTED' jest częścią 'Sections.nsh' – icc97
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 ... –
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 ... –
@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