inno-setup脚本中的可选组件和类型

时间:2012-12-10 18:06:13

标签: inno-setup

我创建了以下InnoSetup脚本,用于根据此StackOverflow答案的建议添加可选组件:Inno Setup - Correct use of [Types], [Components] and [Tasks]

问题是当我运行脚本并选择安装或Sherlock或Toby类型时,我看到Watson也已安装。

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Watson"
#define MyAppVersion "1.0"
#define MyAppExeName "Watson.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{15C6F30B-A29D-48AD-A97A-9FDB4DD80EAE}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=Z:\EGPL Librarian Releases\Setup Scripts\All Install
OutputBaseFilename=LibrarianSetup
Compression=lzma
SolidCompression=yes
WizardImageFile=compiler:WizModernImage-IS.bmp
WizardSmallImageFile=compiler:WizModernSmallImage-IS.bmp
VersionInfoVersion=1.0
VersionInfoCompany=Draper Laboratory
VersionInfoDescription=Watson Librarian Server
VersionInfoTextVersion=Watson 1.0
VersionInfoCopyright=2012
VersionInfoProductName=EGPL Librarian
VersionInfoProductVersion=1.0
VersionInfoProductTextVersion=Watson 1.0

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; Components: Watson Full

[Files]
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.Linq.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.PostgreSql.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.PostgreSql.Linq.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.PostgreSql.xml"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.xml"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Ionic.Zip.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.application"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.exe.config"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.pdb"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
; Toby
Source: "Z:\EGPL Librarian Releases\Sample Installation\wwwroot\Toby\*"; DestDir: "c:\\wwwroot\Toby"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Toby Full
; Sherlock
Source: "Z:\EGPL Librarian Releases\Sample Installation\wwwroot\Sherlock\*"; DestDir: "c:\\wwwroot\Sherlock"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Sherlock Full
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Components: Full Watson
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Components: Full Watson
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Components: Full Watson; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Flags: nowait postinstall skipifsilent; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Components: Watson Full

[Types]
Name: "Everything"; Description: "Install Watson, Sherlock, and Toby"
Name: "Watson"; Description: "Install Only Watson"
Name: "Toby"; Description: "Install Only Toby"
Name: "Sherlock"; Description: "Install Only Sherlock"

[Components]
Name: "Full"; Description: "Full Install"; Types: Watson Everything Toby Sherlock
Name: "Watson"; Description: "Watson Component"; Types: Watson
Name: "Toby"; Description: "Toby Component"; Types: Toby
Name: "Sherlock"; Description: "Sherlock Component"; Types: Sherlock

[Code]
function IsDotNetDetected(version: string; service: cardinal): boolean;
// Indicates whether the specified version and service pack of the .NET Framework is installed.
//
// version -- Specify one of these strings for the required .NET Framework version:
//    'v1.1.4322'     .NET Framework 1.1
//    'v2.0.50727'    .NET Framework 2.0
//    'v3.0'          .NET Framework 3.0
//    'v3.5'          .NET Framework 3.5
//    'v4\Client'     .NET Framework 4.0 Client Profile
//    'v4\Full'       .NET Framework 4.0 Full Installation
//    'v4.5'          .NET Framework 4.5
//
// service -- Specify any non-negative integer for the required service pack level:
//    0               No service packs required
//    1, 2, etc.      Service pack 1, 2, etc. required
var
    key: string;
    install, release, serviceCount: cardinal;
    check45, success: boolean;
begin
    // .NET 4.5 installs as update to .NET 4.0 Full
    if version = 'v4.5' then begin
        version := 'v4\Full';
        check45 := true;
    end else
        check45 := false;

    // installation key group for all .NET versions
    key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version;

    // .NET 3.0 uses value InstallSuccess in subkey Setup
    if Pos('v3.0', version) = 1 then begin
        success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
    end else begin
        success := RegQueryDWordValue(HKLM, key, 'Install', install);
    end;

    // .NET 4.0/4.5 uses value Servicing instead of SP
    if Pos('v4', version) = 1 then begin
        success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
    end else begin
        success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
    end;

    // .NET 4.5 uses additional value Release
    if check45 then begin
        success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
        success := success and (release >= 378389);
    end;

    result := success and (install = 1) and (serviceCount >= service);
end;


function InitializeSetup(): Boolean;
begin
    if not IsDotNetDetected('v4\Full', 0) then begin
        MsgBox('Watson requires Microsoft .NET Framework 4.0 Full Profile.'#13#13
            'Please run dotNetFx40_Full_x86_x64.exe from the install disk,' #13
            'or download from www.microsoft.com/net,'#13
            'and then re-run the WatsonSetup.exe program.', mbInformation, MB_OK);
        result := false;
    end else begin
//        MsgBox('Found Microsoft .NET Framework 4.0.', mbInformation, MB_OK);
        result := true;
    end;
end;

2 个答案:

答案 0 :(得分:7)

将每个文件与一个组件链接,然后将每个组件与不同类型的安装链接,其中将包含组件(及其所有文件)。

例如,定义这四种安装类型:

[Types]
Name: "full"; Description: "Install Watson, Sherlock, and Toby"
Name: "onlywatson"; Description: "Install Only Watson"
Name: "onlytoby"; Description: "Install Only Toby"
Name: "onlysherlock"; Description: "Install Only Sherlock"

您只能定义三个组件:

[Components]
Name: "watson"; Description: "Watson Component"; Types: onlywatson full
Name: "toby"; Description: "Toby Component"; Types: onlytoby full
Name: "sherlock"; Description: "Sherlock Component"; Types: onlysherlock full

如您所见,每个component都包含在两种类型中,一种是仅X 类型的安装,另一种是完整安装类型

然后,为每个组件定义您的文件(除非您有充分的理由包含没有组件或不同组件的文件,但这对我来说没有多大意义。)

[Files]
;watson
Source: "files\Watson.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: watson
Source: "files\Watson.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: watson
Source: "files\other.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: watson
; Toby
Source: "files\toby\*"; DestDir: "{app}\extras\Toby"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: toby
; Sherlock
Source: "files\Sherlock\*"; DestDir: "{app}\extras\Sherlock"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: sherlock

相同的推理适用于其他部分,例如[Icons][Tasks][Run],其中每个条目通常只属于一个组件。

我为你做了一个快速测试,把所有这些放在一起:

#define MyAppName "Watson"
#define MyAppVersion "1.0"
#define MyAppExeName "watson.txt"
#define MyAppPublisher "Me.com"
#define MyAppURL "Me.com"

[Setup]
AppId={{15C6F30B-A29D-48AD-A97A-9FDB4DD80EAE}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=Installer
OutputBaseFilename=LibrarianSetup
Compression=lzma
SolidCompression=yes
WizardImageFile=compiler:WizModernImage-IS.bmp
WizardSmallImageFile=compiler:WizModernSmallImage-IS.bmp
VersionInfoVersion=1.0
VersionInfoCompany=Draper Laboratory
VersionInfoDescription=Watson Librarian Server
VersionInfoTextVersion=Watson 1.0
VersionInfoCopyright=2012
VersionInfoProductName=EGPL Librarian
VersionInfoProductVersion=1.0
VersionInfoProductTextVersion=Watson 1.0

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Types]
Name: "full"; Description: "Install Watson, Sherlock, and Toby"
Name: "onlywatson"; Description: "Install Only Watson"
Name: "onlytoby"; Description: "Install Only Toby"
Name: "onlysherlock"; Description: "Install Only Sherlock"

[Components]
Name: "watson"; Description: "Watson Component"; Types: onlywatson full
Name: "toby"; Description: "Toby Component"; Types: onlytoby full
Name: "sherlock"; Description: "Sherlock Component"; Types: onlysherlock full

[Files]
;watson
Source: "files\Watson.txt"; DestDir: "{app}"; Flags: ignoreversion; Components: watson
Source: "files\Watson1.txt"; DestDir: "{app}"; Flags: ignoreversion; Components: watson
Source: "files\Watson2.txt"; DestDir: "{app}"; Flags: ignoreversion; Components: watson
; Toby
Source: "files\toby\*"; DestDir: "{app}\extras\Toby"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: toby
; Sherlock
Source: "files\Sherlock\*"; DestDir: "{app}\extras\Sherlock"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: sherlock
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Components: Watson
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Components: Watson
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Components: Watson; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Flags: nowait postinstall skipifsilent; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Components: Watson

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; Components: Watson

在我的机器上使用Inno 5.5.2进行测试并按您的需要工作。

答案 1 :(得分:1)

我现在有了它的工作。我做的唯一的补充是Program Files中的卸载图标应该属于所有组件。因此,如果您进行部分安装,您仍然可以选择卸载该部分安装。

Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Components: Watson Sherlock Toby