5

我创建了以下 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;
4

2 回答 2

9

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

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

[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 进行了测试,可以按您的意愿工作。

于 2012-12-11T04:29:14.750 回答
1

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

Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Components: Watson Sherlock Toby
于 2012-12-17T20:05:13.317 回答