Installation 如何使一个nsi部分依赖于另一个nsi部分?

Installation 如何使一个nsi部分依赖于另一个nsi部分?,installation,dependencies,nsis,Installation,Dependencies,Nsis,在NSI中,如何使一个部分依赖于另一个部分 我们的安装程序有四个可见部分(组件): 所有组件都依赖于客户端,因此它是必需的。此外,服务器依赖于数据库,如果数据库不存在,则无法安装。您可以使用.onSelChange回调更改节状态以响应节更改 Outfile test.exe !include Sections.nsh !include LogicLib.nsh Page Components Page InstFiles Section "Client" SectionIn RO Secti

在NSI中,如何使一个部分依赖于另一个部分

我们的安装程序有四个可见部分(组件):


所有组件都依赖于客户端,因此它是必需的。此外,服务器依赖于数据库,如果数据库不存在,则无法安装。

您可以使用.onSelChange回调更改节状态以响应节更改

Outfile test.exe
!include Sections.nsh
!include LogicLib.nsh

Page Components
Page InstFiles

Section "Client"
SectionIn RO
SectionEnd

Section /o "Database" SEC_DB
SectionEnd

Section /o "Server" SEC_SRV
SectionEnd

Section /o "Interface"
SectionEnd


Function .onSelChange
${If} ${SectionIsSelected} ${SEC_SRV}
    !insertmacro SetSectionFlag ${SEC_DB} ${SF_RO}
    !insertmacro SelectSection ${SEC_DB}
${Else}
    !insertmacro ClearSectionFlag ${SEC_DB} ${SF_RO}
${EndIf}
FunctionEnd
或不带只读数据库部分:

Function .onSelChange
var /Global HadSecSrv
${IfNot} ${SectionIsSelected} ${SEC_DB}
    ${If} $HadSecSrv <> 0
        !insertmacro UnselectSection ${SEC_SRV}
    ${EndIf}
${EndIf}
StrCpy $HadSecSrv 0
${If} ${SectionIsSelected} ${SEC_SRV} 
    StrCpy $HadSecSrv 1
    !insertmacro SelectSection ${SEC_DB}
${EndIf}
FunctionEnd
Function.onSelChange
var/全局HadSecSrv
${IfNot}${SectionIsSelected}${SEC_DB}
${If}$HadSecSrv 0
!insertmacro取消选择节${SEC_SRV}
${EndIf}
${EndIf}
StrCpy$HadSecSrv 0
${If}${SectionIsSelected}${SEC_SRV}
StrCpy$HadSecSrv 1
!insertmacro SelectSection${SEC_DB}
${EndIf}
功能端

One gotcha:the.onSelChange方法需要在其修改的所有节下面进行修改。是的,这是因为节id仅在节指令之后定义。
Function .onSelChange
var /Global HadSecSrv
${IfNot} ${SectionIsSelected} ${SEC_DB}
    ${If} $HadSecSrv <> 0
        !insertmacro UnselectSection ${SEC_SRV}
    ${EndIf}
${EndIf}
StrCpy $HadSecSrv 0
${If} ${SectionIsSelected} ${SEC_SRV} 
    StrCpy $HadSecSrv 1
    !insertmacro SelectSection ${SEC_DB}
${EndIf}
FunctionEnd