Dependency Solving Example | Qt Installer Framework Manual

Qt Installer Framework Manual | Qt Installer Framework Examples | Dependency Solving Example

# Dependency Solving Example

Dependency Solving illustrates how to specify dependencies and automatic dependencies between components in the package information files and how that influences the installation and maintenance processes.

## Configuring the Example Installer

The installer configuration file, config.xml, in the `config` directory specifies the text and default values used in the installer:

- The `<Name>` element specifies the application name that is added to the page name and introduction text.
- The `<Version>` element specifies the application version number.
- The `<Title>` element specifies the installer name displayed on the title bar.
- The `<Publisher>` element specifies the publisher of the software (as shown in the Windows Control Panel, for example).
- The `<StartMenuDir>` element specifies the name of the default program group for the product in the Windows Start menu.
- The `<TargetDir>` element specifies that the default target directory is located in the `IfwExamples` directory in the home directory of the current user (because the predefined variable`@HomeDir@` is used as a part of the value). For more information, see Predefined Variables.

- The `<CreateLocalRepository>` element is set to `true` to create a local repository. This enables end users to run the maintenance tool after the initial installation to install additional components or to uninstall components. The changes in the installation will respect the dependencies defined in the example.

      <?xml version="1.0" encoding="UTF-8"?>
      <Installer>
          <Name>Dependency Solving Example</Name>
          <Version>1.0.0</Version>
          <Title>Dependency Solving Example</Title>
          <Publisher>Qt-Project</Publisher>
          <StartMenuDir>Qt IFW Examples</StartMenuDir>
          <TargetDir>@HomeDir@/IfwExamples/dependencies</TargetDir>
          <CreateLocalRepository>true</CreateLocalRepository>
          <InstallActionColumnVisible>true</InstallActionColumnVisible>
      </Installer>

## Creating the Example Package Information File

The installer package information file, package.xml, in the `meta` directory specifies the components that are available for installation:

- The `<DisplayName>` element specifies the human-readable name of the component.
- The `<Description>` element specifies the human-readable description of the component.
- The `<Version>` element specifies the version number of the component.
- The `<ReleaseDate>` element specifies the date when this component version was released.

- The `<SortingPriority>` element specifies the location of the component in the component tree. The tree is sorted from highest to lowest priority, with the highest priority on the top.

In this example, the package.xml files for the components contain additional elements that specify the dependencies. The following sections illustrate how the elements are used.

## Specifying Dependencies on Other Components

We define a dependency for Component C on Component A and Component B. Thus, if we select Component C for installation, both Component A and Component B are installed as well. We define the dependencies in the `<Dependencies>` element in Component C's package.xml file as a comma-separated list of the identifiers of the components that this component depends on:

      <?xml version="1.0"?>
      <Package>
          <DisplayName>Component C (depends on A and B)</DisplayName>
          <Description>This component depends on Component A and Component B. Selecting this component for installation also marks Component A and Component B for installation, which in turn marks Component D, because it has an automatic dependency on Component A and Component B.</Description>
          <Dependencies>componentA, componentB</Dependencies>
          <Version>1.0.0</Version>
          <ReleaseDate>2014-08-25</ReleaseDate>
          <SortingPriority>80</SortingPriority>
      </Package>

## Specifying Automatic Dependencies on Other Components

We define an automatic dependency for Component D on Component A and Component B. Thus, if Component A and Component B are both marked for installation, Component D is automatically installed as well. We define the automatic dependency in the `<AutoDependOn>` element in Component D's package.xml file:

      <?xml version="1.0"?>
      <Package>
          <DisplayName>Component D (auto depends on A and B)</DisplayName>
          <Description>This component has an automatic dependency on Component A and Component B. If both A and B are marked for installation, this component is also installed.</Description>
          <AutoDependOn>componentA, componentB</AutoDependOn>
          <Version>1.0.0</Version>
          <ReleaseDate>2014-08-25</ReleaseDate>
          <SortingPriority>70</SortingPriority>
      </Package>

## Forcing the Installation of a Component

We define that Component E is always automatically installed and the end user cannot deselect it. To define this, we set the `<ForcedInstallation>` element to `true` in Component E's package.xml file:

      <?xml version="1.0"?>
      <Package>
          <DisplayName>Component E (forced)</DisplayName>
          <Description>This is a forced component that is always installed.</Description>
          <ForcedInstallation>true</ForcedInstallation>
          <Version>1.0.0</Version>
          <ReleaseDate>2014-08-25</ReleaseDate>
          <SortingPriority>60</SortingPriority>
      </Package>

## Installing Components by Default

We define a dependency for Component G on Component A, and we mark G as a default component. Thus, Component G is marked for installation by default, and so is Component A, because it is required by G. To define this, we set the value of the `<Default>` element to `true` in Component G's package.xml file:

      <?xml version="1.0"?>
      <Package>
          <DisplayName>Component G (default, depends on A, dependency added dynamically)</DisplayName>
          <Description>By default, this component is selected for installation. It depends on component A. Dependency is added from inside component script.</Description>
          <Default>true</Default>
          <Version>1.0.0</Version>
          <ReleaseDate>2014-08-25</ReleaseDate>
          <Script>installscript.js</Script>
          <SortingPriority>30</SortingPriority>
      </Package>

## Solving the Dependencies

Selecting component C for installation also selects the following components:

- Component A and Component B, because Component C requires them.
- Component D, because both Component A and Component B are marked for installation and thus the conditions for installing Component D are met.

## Generating the Example Installer

To create the example installer, switch to the example source directory on the command line and enter the following command:

- On Windows:

        ..\..\bin\binarycreator.exe -c config\config.xml -p packages installer.exe

- On Linux or OS X:

        ../../bin/binarycreator -c config/config.xml -p packages installer

The installer is created in the current directory.

Files:

- dependencies/config/config.xml
- dependencies/packages/componentA/data/installcontent.txt
- dependencies/packages/componentA/meta/package.xml
- dependencies/packages/componentB/meta/package.xml
- dependencies/packages/componentC/meta/package.xml
- dependencies/packages/componentD/meta/package.xml
- dependencies/packages/componentE/meta/package.xml
- dependencies/packages/componentF/meta/package.xml
- dependencies/packages/componentF.subcomponent1/meta/package.xml
- dependencies/packages/componentF.subcomponent1.subsubcomponent1/meta/package.xml
- dependencies/packages/componentF.subcomponent1.subsubcomponent2/meta/package.xml
- dependencies/packages/componentF.subcomponent2/meta/package.xml
- dependencies/packages/componentF.subcomponent2.subsubcomponent1/meta/package.xml
- dependencies/packages/componentF.subcomponent2.subsubcomponent2/meta/package.xml
- dependencies/packages/componentG/meta/installscript.js
- dependencies/packages/componentG/meta/package.xml
- dependencies/dependencies.pro