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.

  1. Valitse Qt:ssa release moodi (kuva alla)
  2. Käännä sovellus
  3. Avaa komentokehote kansioon, jossa on sovellus windeployqt6. Minulla se on kansiossa c:\Qt\6.5.2\mingw_64\bin
  4. Anna komento
    .\windeployqt6 "C:\qt_projects\myapp\build\release\myapp.exe"
    
    Jossa mainittu polku osoittaa siihen kansioon, jossa sovelluksesi exe-file sijaitsee.
  5. Jos siirrät nyt kansion release sisällön toiseen Windows-koneeseen, sen pitäisi toimia siinäkin.

Asennustiedoston luominen

Edellisessä esimerkissä on se vika, että sovelluksen julkaisijan tulee toimittaa koko kansio. Inno Setup sovelluksen avulla voidaan luoda yksi tiedosto, jonka avulla sovellus voidaan asentaa Windows koneelle.

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

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

Seuraavassa esimerkissä teen luomastani MyWeather Qt Widget sovelluksesta asennustiedoston. Tein asennuksesta videon Setupin luominen

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 myweather.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 myweather.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 myweather.exe

Inno Setup -scriptin luominen

1. Luo myweather.iss tiedosto

Luo tiedosto myweather.iss projektin juureen

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

#define MyAppName "My Weather"
#define MyAppVersion "0.1"
#define MyAppPublisher "Your Name/Company"
#define MyAppExeName "myweather.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=MyWeatherSetup
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=myweather\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: "myweather\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 myweather.iss
  3. Valitse Build → Compile (tai paina F9)
  4. Setup-tiedosto luodaan output kansioon nimellä MyWeatherSetup.exe

Vaihtoehto B: Komentorivi

"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" myweather.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

Qt-riippuvuudet

Sovellus tarvitsee seuraavat Qt-komponentit (windeployqt hoitaa nämä):

  • Qt6Core.dll / Qt5Core.dll
  • Qt6Gui.dll / Qt5Gui.dll
  • Qt6Widgets.dll / Qt5Widgets.dll
  • Qt6Network.dll / Qt5Network.dll
  • Qt6SerialPort.dll / Qt5SerialPort.dll
  • Eri platformpluginit (platforms\qwindows.dll)
  • Styles-pluginit
  • Kääntäjän runtime-kirjastot (esim. libgcc_s_seh-1.dll, libstdc++-6.dll)

Ympäristömuuttujat

Jos sovelluksesi käyttää environment.h/cpp tiedostoja backend URL:n määrittämiseen, varmista että:

  1. Joko URL on kovakoodattu Release-versioon
  2. Tai sovellus lukee sen konfiguraatiotiedostosta
  3. Tai käyttäjä voi määrittää sen ensimmäisellä käynnistyskerralla

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. Luo GitHub-repositoriosi juureen kansio .github/workflows ja lisää sinne tiedosto create-release.yml seuraavalla sisällöllä:

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 "CMakeLists.txt" -Pattern 'project\(MyWeather 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 -B 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 build
      shell: cmd

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

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

    - name: Create installer
      run: iscc MyWeather.iss

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

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

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

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

Qt-sovellus alikansiossa (esim. frontend)

Jos Qt-sovelluksesi ei ole repositorion juuressa vaan alikansiossa (esim. frontend), tee seuraavat muutokset workflow-tiedostoon:

1. Version lukeminen alikansiosta

Muuta Get version from CMakeLists.txt -vaiheen polku:

    - name: Get version from CMakeLists.txt
      id: get_version
      run: |
        $version = Select-String -Path "frontend/CMakeLists.txt" -Pattern 'project\(MyWeather 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

2. CMake-konfigurointi alikansiosta

Lisää -S frontend parametri määrittämään lähdekansio:

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

3. Inno Setup -tiedoston polku

Muuta Inno Setup -tiedoston polku osoittamaan alikansioon:

    - name: Create installer
      run: iscc frontend/MyWeather.iss

Huom: Build-, Deploy Qt dependencies- ja muut vaiheet pysyvät ennallaan, koska build-kansio luodaan edelleen repositorion juureen.

Julkaisu Websivuston kautta

Voit automatisoida asennuspaketin luomisen ja julkaisun webpalvelimellesi GitHub Actions -työkalulla. Seuraava esimerkki näyttää kuinka luodaan workflow, joka kääntää Qt-sovelluksesi, luo asennuspaketin ja siirtää sen automaattisesti webpalvelimellesi SCP:llä aina kun päivität main-branchin.

Tein videon GitHub Actionsin käytöstä Qt-sovelluksen julkaisuun: Qt-sovelluksen julkaisu GitHub Actionsilla

Luo GitHub-repositoriosi juureen kansio .github/workflows ja lisää sinne tiedosto build-and-deploy.yml seuraavalla sisällöllä:


name: Build and Deploy MyWeather

on:
  push:
    branches: [ main ]

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

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

    - 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 -B 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 build
      shell: cmd

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

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

    - name: Create installer
      run: iscc MyWeather.iss

    - 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: "output/MyWeatherSetup.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