В настоящее время у меня есть два установщика WIX для продукта, который я поддерживаю. Один для 32-разрядных операционных систем и один для 64-разрядных операционных систем. Вместо того, чтобы поддерживать два отдельных установщика, я хочу объединить их в один установщик NSIS, который может "определить" "битность" ОС, а затем скопировать соответствующие двоичные файлы в каталог программы. Кто-нибудь имел какой-либо опыт с этим и мог предоставить рабочий образец script, который NSIS может использовать для установки установщика?
Использовать один установщик NSIS для установки 32-разрядных двоичных файлов в 32-разрядной ОС и 64-битных двоичных файлов в 64-битной ОС?
Ответ 1
x64.nsh содержит вспомогательные макросы, и вы можете установить их в $programfiles32
или $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
Ответ 2
Я считаю, что понял это... Я еще не тестировал это, но он должен работать...
Ответ заключается в создании двух "разделов" для каждого набора файлов. SEC0000
для 32-разрядных и SEC0001
для 64-битных файлов. Тогда,
!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
Я считаю, что в функции un.onInit
потребуется такая же логика, чтобы Uninstaller знал, какие файлы удалить...
Ответ 3
Для простого универсального установщика, использующего 3.0a0, я нашел с небольшим экспериментом, что для меня работало следующее:
!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
Мне просто нужно было запомнить функцию после ссылочных разделов. Каждый из моих разделов просто ссылался на одноименный .exe в своих 32-битных/64-битных/каталогах, поэтому мой деинсталлятор не нуждался в специальной обработке. Я не тестировал его на 32-битной системе, но он работал для 64-разрядной системы.
Пример:
section "64-bit" SEC0001
messageBox MB_OK "64-BIT!"
File "C:\foo\64-bit\some-utility.exe"
sectionEND