2012-06-20 42 views
14

我目前有兩個WIX安裝程序用於我維護的產品。一個用於32位操作系統,另一個用於64位操作系統。我不想維護兩個單獨的安裝程序,而是將它們組合成一個NSIS安裝程序,它可以「確定」操作系統的「位」,然後將適當的二進制文件複製到程序目錄中。有沒有人有過這方面的經驗,可以提供一個NSIS可以用來製作安裝程序的工作示例腳本?使用一個NSIS安裝程序可以在32位操作系統上安裝32位二進制文​​件,並在64位操作系統上安裝64位二進制文​​件?

回答

11

x64.nsh有一定的輔助宏,你可以安裝到$programfiles32$programfiles64

編輯:

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

我沒有看這個,這將讓我確定操作系統的位數,但我仍然會碰到,我需要告訴要安裝哪些文件安裝程序的問題。我目前有一個「部分」,其中包含: 'SetOutPath $ {PROGRAMINSTALL} File/r build \\ *' 所以我不確定x64模塊會在這種情況下有所幫助... –

+0

另外, m沒有在64位系統上安裝32位二進制文​​件...我在64位操作系統上安裝64位文件,在32位操作系統上安裝32位文件... –

+0

@JulianEasterling這樣說系統要安裝的文件。如果你將64位文件放在'build \ 64'中,並且在'build \ 32'中放入32位文件。如果您還需要根據體系結構更改安裝目錄,則可以在If/Else中放置'SetOutPath' – icc97

4

我相信,我想通了......我沒有測試過這個呢,但它應該工作...

答案是爲每組文件創建兩個「部分」。用於32位的SEC0000和用於64位文件的SEC0001。然後,

!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功能也因此卸載程序知道哪些文件刪除...

+1

使用sections.nsh中的幫助程序宏選擇/取消選擇部分... – Anders

4

對於使用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 

我必須記住把函數引用的部分後。我的每個部分都簡單地在其各自的32位/和64位/目錄中引用同名的.exe,因此我的卸載程序不需要任何特殊處理。我沒有在32位系統上測試過它,但它確實適用於64位系統。

例子:

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

因此,您需要' !在你的腳本中包含「Sections.nsh」'作爲'SF_SELECTED'選擇是'Sections.nsh'的一部分 – icc97

相關問題