如何选择包含某些功能的某些代码?

Jer*_*dge 4 inno-setup conditional-compilation

在Inno Setup中,我有一个主要脚本是"核心系统",这意味着我们的软件完全需要安装/运行所需的一切.另外,我正在为每个主要功能编写脚本文件,这些功能可能会也可能不会编译到安装程序中.在主脚本文件的顶部,我包含其他脚本文件...

#include "AdditionalOption.iss"
#include "AnotherOption.iss"
Run Code Online (Sandbox Code Playgroud)

在编译这个主脚本时,编辑人员可以选择是否在安装程序中编译这些特定选项(由于各种原因而备用文件大小).

当主脚本中的特定代码依赖于其中一个附加脚本中的某些内容时,会出现问题.例如...

procedure InitializeWizard();
begin
  //Creates custom wizard page only if "AdditionalOption.iss" is compiled
  CreatePageForAdditionalOption; 
  //Creates custom wizard page only if "AnotherOption.iss" is compiled
  CreatePageForAnotherOption; 
end;
Run Code Online (Sandbox Code Playgroud)

InitializeWizard只能定义一次,但我需要有条件地调用代码,具体取决于是否包含其他脚本.这些过程驻留在相应的脚本文件中,因此如果用户排除了其他脚本文件,它们当然不存在.

在Delphi中,我可以使用这样的条件:

{$DEFINE ADD_OPT}
{$DEFINE ANO_OPT}

procedure InitializeWizard();
begin
  {$IFDEF ADD_OPT}
  CreatePageForAdditionalOption;
  {$ENDIF}
  {$IFDEF ANO_OPT}
  CreatePageForAnotherOption;
  {$ENDIF}
end;
Run Code Online (Sandbox Code Playgroud)

当然这不是Delphi.我如何在Inno Setup中做这样的事情?

Kor*_*fin 5

Inno Setup的具有预处理器使您可以使用#ifdef,#else并且#endif您可以通过设置iscc.exe /D命令行参数(S).你可以定义多个#ifdef并通过多个设置它们/D.

; Command line param => /DADD_OPT
#ifdef ADD_OPT
  ...
#else
  ...
#endif
Run Code Online (Sandbox Code Playgroud)

我用它们来覆盖默认值:

; Command line param => /DENVIRONMENT=Prod
#ifdef ENVIRONMENT
  #define Environment ENVIRONMENT
#else
  #define Environment "Beta"
#endif
Run Code Online (Sandbox Code Playgroud)

  • 试试这个... https://jrsoftware.org/ispphelp/index.php?topic=ifdef (2认同)