Qt-ohjelmointi
Qt-sovelluksen julkaiseminen

Näillä ohjeilla voit julkaista sovelluksesi eli tehdä siitä version, joka voidaan suorittaa myös koneella, jossa ei ole Qt:ta.

Qt-sovelluksen julkaisussa käytetään kahta työkalua:

  • windeployqt6 - Qt:n mukana tuleva työkalu, joka kerää automaattisesti kaikki tarvittavat DLL-tiedostot, pluginit ja resurssit sovelluksen mukaan. Ilman tätä sovellus ei toimi koneella, jossa ei ole Qt:ta asennettuna.
  • Inno Setup - ilmainen asennusohjelmageneraattori, jolla luodaan ammattimaiset Windows-asennuspaketit. Sen avulla voit pakata sovelluksesi ja kaikki riippuvuudet yhdeksi .exe-tiedostoksi, jonka käyttäjät voivat helposti ladata ja asentaa.

myapp.exe Qt Application windeployqt6 build/ myapp.exe Qt6Core.dll Qt6Widgets.dll plugins/... Inno Setup myappSetup.exe Installer
Asennustiedoston luominen

Tämä ohje opastaa Qt-sovelluksen asennuspaketin luomisessa Inno Setup -työkalulla.

Lataa ja asenna Inno Setup https://jrsoftware.org/isdl.php

Seuraavassa esimerkissä luodaan myapp Qt-sovelluksesta asennustiedosto.

Esivalmistelut

1. Käännä sovellus Release-tilassa

Ennen asennuspaketin luomista sovellus täytyy kääntää Release-tilassa:

Tämän jälkeen build kansiosta löytyy myapp.exe tiedosto.

2. Kerää Qt-riippuvuudet windeployqt-työkalulla

Qt-sovellukset tarvitsevat mukaan useita DLL-tiedostoja ja resursseja. Qt:n mukana tuleva windeployqt työkalu kerää nämä automaattisesti.

Avaa komentokehote build kansioon ja suorita:

c:\Qt\6.9.1\mingw_64\bin\windeployqt.exe myapp.exe

Tämä komento kopioi kaikki tarvittavat Qt DLL-tiedostot, pluginit ja resurssit samaan kansioon sovelluksen kanssa.

Huom: Jos käytät Visual Studiota, käytä windeployqt --release myapp.exe

Inno Setup -scriptin luominen

1. Luo myapp.iss tiedosto

Luo tiedosto myapp.iss projektin juureen

; myapp Setup Script for Inno Setup
; Requires Inno Setup 6.0 or later

#define MyAppName "MyApp"
#define MyAppVersion "0.1"
#define MyAppPublisher "Your Name/Company"
#define MyAppExeName "myapp.exe"
#define MyAppURL "https://yourwebsite.com"

[Setup]
; Perusasetukset
AppId={{YOUR-UNIQUE-GUID-HERE}}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
LicenseFile=
InfoBeforeFile=
InfoAfterFile=
OutputDir=output
OutputBaseFilename=myappSetup
SetupIconFile=
Compression=lzma
SolidCompression=yes
WizardStyle=modern
PrivilegesRequired=admin

; Kieliasetukset
ShowLanguageDialog=auto

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

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

[Files]
; Pääohjelma ja kaikki riippuvuudet
Source: "build\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

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

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent

[Code]
// Tarkista että .NET Framework tai muut riippuvuudet on asennettu
function InitializeSetup(): Boolean;
begin
  Result := True;
end;

2. Luo uniikki GUID

Korvaa {YOUR-UNIQUE-GUID-HERE} uniikilla GUID:lla. Voit luoda sen esim. PowerShellissä:

[guid]::NewGuid().ToString().ToUpper()

Tai online-työkalulla: https://www.guidgenerator.com/

Esimerkki: AppId={{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}}

3. Lisäasetukset (valinnainen)

Sovelluskuvake

Jos haluat lisätä custom-ikonin:

  1. Luo .ico tiedosto (esim. app-icon.ico)
  2. Lisää rivi: SetupIconFile=myapp\app-icon.ico

Lisenssi

Jos haluat näyttää lisenssin asennuksen aikana:

  1. Luo LICENSE.txt tiedosto
  2. Lisää rivi: LicenseFile=LICENSE.txt

Määritystiedostot

Jos sovelluksesi tarvitsee konfiguraatiotiedostoja (esim. backend URL):

[Files]
Source: "myapp\config\*"; DestDir: "{app}\config"; Flags: ignoreversion

Asennuspaketin luominen

Käännä setup Inno Setup Compilerilla

Vaihtoehto A: Graafinen käyttöliittymä

  1. Avaa Inno Setup Compiler
  2. Valitse File → Open ja avaa myapp.iss
  3. Valitse Build → Compile (tai paina F9)
  4. Setup-tiedosto luodaan output kansioon nimellä myappSetup.exe

Vaihtoehto B: Komentorivi

"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" myapp.iss

Ikoni

Edellä mainitussa iss-tiedostossa määritettävä ikoni tulee asennusohjelmalle. Qt-sovelluksen ikoni voidaan määrittää seuraaavasti

  1. lisää projektin juureen tiedosto appicon.rc, jossa rivi
    IDI_ICON1 ICON "favicon.ico"
    
  2. lisää CmakeLists.txt tiedostoon rivi appicon.rc seuraavasti;
    set(PROJECT_SOURCES
            main.cpp
            mainwindow.cpp
            mainwindow.h
            mainwindow.ui
            appicon.rc
    )
    

Huomioitavaa

Koko

Setup-tiedoston koko on tyypillisesti 30-50 MB Qt-sovelluksille kaikkien riippuvuuksien kanssa.

Päivitykset

Kun julkaiset uuden version:

  1. Päivitä #define MyAppVersion arvoa
  2. Käännä uusi setup samalla tavalla
  3. Vanha versio poistetaan automaattisesti ennen uuden asentamista (sama AppId)
GitHub release

Voit automatisoida asennuspaketin luomisen ja julkaisun GitHub Actions -työkalulla. Seuraava workflow kääntää sovelluksesi, luo asennuspaketin ja julkaisee sen automaattisesti GitHub Releases -osiossa aina kun päivität release-branchin. Käyttäjät voivat sitten ladata ja asentaa sovelluksesi suoraan GitHubista.

Seuraavassa on esimerkki GitHub Action -workflow'sta. Esimerkissä käytetään Inno Setupia asennuspaketin luomiseen. Huomaa, että sinun ei tarvitse ajaa windeployqt komentoa paikallisesti, mutta sinun on luotava iss-tiedosto. Luo GitHub-repositoriosi juureen kansio .github/workflows ja lisää sinne tiedosto create-release.yml seuraavalla sisällöllä:
Huom! Tässä esimerkissä Qt-sovellus ei ole Gitrepon juuressa vaan kansiossa myapp ja sovelluksen nimi on myöskin myapp.

name: Create GitHub Release

on:
  push:
    branches: [ release ]

permissions:
  contents: write

jobs:
  build-and-release:
    runs-on: windows-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Get version from CMakeLists.txt
      id: get_version
      run: |
        $version = Select-String -Path "myapp/CMakeLists.txt" -Pattern 'project\(myapp VERSION ([0-9.]+)\)' | ForEach-Object { $_.Matches.Groups[1].Value }
        if (-not $version) {
          $version = "1.0.0"
        }
        echo "VERSION=$version" >> $env:GITHUB_OUTPUT
        echo "Version: $version"
      shell: pwsh

    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.9.1'
        host: 'windows'
        target: 'desktop'
        arch: 'win64_msvc2022_64'
        modules: 'qtnetworkauth'

    - name: Configure CMake
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
        cmake -S myapp -B myapp/build -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="${{ env.QT_ROOT_DIR }}"
      shell: cmd

    - name: Build
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
        cmake --build myapp/build
      shell: cmd

    - name: Deploy Qt dependencies
      run: windeployqt myapp/build/myapp.exe --release

    - name: Install Inno Setup
      run: choco install innosetup -y

    - name: Create installer
      run: iscc myapp\myapp.iss

    - name: Create GitHub Release
      uses: softprops/action-gh-release@v1
      with:
        tag_name: v${{ steps.get_version.outputs.VERSION }}
        name: BankAutomat v${{ steps.get_version.outputs.VERSION }}
        body: |
          ## BankAutomat v${{ steps.get_version.outputs.VERSION }}

          ### Lataa asennusohjelma
          Lataa myappSetup.exe alta ja suorita se asentaaksesi sovelluksen.

          ### Muutokset
          - Automaattisesti luotu release release-branchista
        files: |
          myapp/output/myappSetup.exe
        draft: false
        prerelease: false

Koodin selitykset

Sinun on ehkä tehtävä GitHubissa repon asetuksissa seuraavat määritykset:

  1. Repository → Settings
  2. Vasemmalta Actions → General
  3. Alhaalla kohdassa Workflow permissions:
    • Valitse "Read and write permissions"
    • Varmista että "Allow GitHub Actions to create and approve pull requests" on päällä
  4. Tallenna Save

Julkaisu Websivuston kautta

Jos haluat julkaista asennuspaketin webpalvelimellesi GitHub Releasen sijaan, lisää edelliseen workflow-tiedostoon seuraava step asennuspaketin luomisen jälkeen:

    - name: Deploy to web server via SCP
      uses: appleboy/scp-action@v0.1.7
      with:
        host: ${{ secrets.WEB_SERVER_HOST }}
        username: ${{ secrets.WEB_SERVER_USER }}
        key: ${{ secrets.WEB_SERVER_SSH_KEY }}
        port: 22
        source: "myapp/output/myappSetup.exe"
        target: ${{ secrets.WEB_SERVER_PATH }}

GitHub Secrets -muuttujat: Yllä olevassa esimerkissä käytetään secrets.WEB_SERVER_HOST, secrets.WEB_SERVER_USER jne. muuttujia. Näitä käytetään turvallisuussyistä - SSH-avaimia ja palvelimen tietoja ei saa koskaan kirjoittaa suoraan workflow-tiedostoon, koska ne näkyisivät julkisesti GitHubissa. GitHub Secrets tallentaa nämä salattuina.

Jotta saat edellisen toimimaan, sinun tulee määrittää SSH-avaimesi ja web-palvelimen tiedot GitHub Secrets -asetuksiin oheisen ohjeen mukaisesti: GitHub Secrets



Toggle Menu