Dependency Solving Example

Using components' package.xml files to define dependencies and automatic dependencies between components.

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 sets the application name and adds it to the page name and introduction text.
  • The <Version> element sets the application version number.
  • The <Title> element sets the installer name and displays it on the title bar.
  • The <Publisher> element sets the publisher of the software (as shown in the Windows Control Panel, for example).
  • The <StartMenuDir> element sets the name of the default program group for the product in the Windows Start menu.
  • The <TargetDir> element sets the default target directory location to be within the IfwExamples directory in the home directory of the current user (because it uses the pre-existing variable , @HomeDir@, as 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 sets the human-readable name of the component.
  • The <Description> element sets the human-readable description of the component.
  • The <Version> element sets the version number of the component.
  • The <ReleaseDate> element sets the date of release for this component version.
  • 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 macOS:
    ../../bin/binarycreator -c config/config.xml -p packages installer

This creates the installer to the current directory.

Files:

© 2021 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. The Qt Company, Qt and their respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.