Qt Installer Framework: TypeError не может прочитать имя свойства

Я попытался создать установщик, следуя инструкциям. Затем я добавил сценарий с именем installerscript.qs в соответствии с примером стартового меню в каталоге Qt Installer Framework.

Файл installscript.qs выглядит следующим образом:

/****************************************************************************
**
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** 
**
**  open-editor to use.
**  Copyright (C) 2018  os_sys-devlopment-group
**
**  This program is free software: you can redistribute it and/or modify
**  it under the terms of the GNU General Public License as published by
**  the Free Software Foundation, either version 3 of the License, or
**  (at your option) any later version.
**  This program is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  You should have received a copy of the GNU General Public License
**  along with this program.  If not, see <https://www.gnu.org/licenses/>.
** view the full license at https://www.stranica.nl/open-editor/license.txt
**
** $QT_END_LICENSE$
**
****************************************************************************/

function Component()
{
    // default constructor
}

Component.prototype.createOperations = function()
{

    component.createOperations();


    if (systemInfo.productType === "windows") {
        component.addOperation("CreateShortcut", "@TargetDir@/customtexteditor.exe", "@StartMenuDir@/open-editor.lnk",
            "workingDirectory=@TargetDir@","iconPath=%TargetDir%/Logo.ico");
        component.addOperation("CreateDesktopShortcut", "@TargetDir@/customtexteditor.exe", "@DesktopDir@/open-editor.lnk", 
            "workingDirectory=@TargetDir@", "iconPath=%TargetDir%/Logo.ico",);
    }
    
}

Мой package.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>open-editor</DisplayName>
    <Description>open-editor</Description>
    <Version>1.0.2</Version>
    <ReleaseDate>2019-11-10</ReleaseDate>
    <Default>true</Default>
    <Name>open-editor</Name>
    <Licenses>
        <License name="End User License Agreement" file="license.txt" />
    </Licenses>
    <ForcedInstallation>true</ForcedInstallation>
    <Script>installscript.qs</Script>
</Package>

Когда я запускаю установщик, я получаю сообщение об ошибке:

Exception while loading component script "D:\system\temp\remoterepo-Q2Q7ZU\open-editor\installscript.qs": TypeError: cannot read property 'name' of null on line number: 1

Этот пример работал, когда я пробовал его в каталоге примеров. Но дает мне указанную выше ошибку, когда я немного изменяю ее для работы с моим собственным кодом.

есть идеи, почему это не работает?

я использую эту команду для двоичного создателя:

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

вы можете перейти по следующей ссылке, чтобы просмотреть весь проект: https://ftp.stranica.nl/index/help/project вы можете найти все файлы моего проекта

zip-файл в этом каталоге содержит весь пакет

я внес изменения во все свои пакеты, так что теперь все выглядит немного по-другому, но то же самое


person Matthijs990    schedule 10.11.2019    source источник
comment
Можем ли мы узнать больше о том, как вы это настраиваете, и особенно о командной строке binarycreator? Из того, что вы написали, я не вижу никакой проблемы. Но мне интересно, откуда он получает путь com.mycompany.program. IIRC путь к пакетам задается параметром -p и дополнительным списком пакетов в этой папке с параметром -l. Вы используете абсолютные или относительные пути для указания различных местоположений? (Не уверен, что это имеет значение, но может быть.)   -  person Maxim Paperno    schedule 14.11.2019
comment
см. редактирование команды двоичного создателя   -  person Matthijs990    schedule 14.11.2019
comment
@MaximPaperno ^^   -  person S.S. Anne    schedule 17.11.2019


Ответы (2)


Как указывалось в другом комментарии, пути важны.

Честно говоря, у QtInstallerFramework не очень хорошая документация, и многое из этого я понял методом проб и ошибок.

Это ни в коем случае не единственный способ сделать это. Надеюсь, это поможет в качестве примера. Также стоит отметить, что это будет работать и на Linux/OSX с некоторыми небольшими вариациями.

Дерево каталогов:

rootdir
    installer
        config
            config.xml   <#1 below>
        packages
        com.<vendor>.installer
            meta
                package.xml  <#2 below>
        com.<vendor>.<name>  [This can be 1-N of these]
            meta
                installscript.qs  <#3 below>
                package.xml       <#4 below>
            data
                <name>
                    <executable and dependencies here>

config.xml #1:

Примечание. @var@ заменяются автоматически, заполните данные в []

<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>[Name]</Name>
    <Version>[Version]</Version>
    <Title>[Application Title]</Title>
    <Publisher>[Publisher]</Publisher>
    <StartMenuDir>[VendorName]/[Name] [Version]</StartMenuDir>
    <TargetDir>@ApplicationsDir@/[Publisher]/[Name] @Version@</TargetDir>
    <ProductUrl>[yoururlhere.com]</ProductUrl>
</Installer>

пакет.xml # 2:

<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>Installer</DisplayName>
    <Description>[Publisher] Software Installer</Description>
    <Version>[1.0.0]</Version>
    <ReleaseDate>[2019-11-13]</ReleaseDate>
    <Name>com.[Vendor].installer</Name>
    <Virtual>true</Virtual>
    <UpdateText>This changed compared to the last release</UpdateText>
</Package>

installscript.qs #3:

function Component()
{
    // default constructor
}

Component.prototype.createOperations = function()
{
    // This actually installs the files
    component.createOperations();

    if (systemInfo.productType == "windows") {
        // Start menu shortcut
        component.addOperation("CreateShortcut", 
                               "@TargetDir@/[Name]/[Executable.exe]", 
                               "@StartMenuDir@/[Name].lnk", 
                               "workingDirectory=@TargetDir@/[Name]", 
                               "iconPath=@TargetDir@/[Name]/[Name].ico");

       // Desktop Shortcut
       component.addOperation("CreateShortcut", 
                              "@TargetDir@/[Name]/[Executable.exe]",
                              "@DesktopDir@/[Name] @[email protected]",
                              "workingDirectory=@TargetDir@/[Name]", 
                              "iconPath=@TargetDir@/[Name]/[Name].ico");
    }
}

пакет.xml #4:

<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>[Name]</DisplayName>
    <Description>[Some description]</Description>
    <Version>[Version]</Version>
    <ReleaseDate>[Date]</ReleaseDate>
    <Name>com.[vendor].[name]</Name>
    <Script>installscript.qs</Script>
    <Default>false</Default>
    <ForcedInstallation>true</ForcedInstallation>
</Package>

Отсюда вы создаете свое приложение, копируете двоичный файл в папку com.[vendor].[name]/data/[name]/.

Если это приложение Qt, вам следует использовать windeployqt.exe для каждого приложения в каждом соответствующем целевом каталоге ([name]/data/[name]/[executable.exe] для добавления всех зависимостей Qt.

Наконец, чтобы создать пакет установщика (автономная версия) с помощью следующей команды (из корневого каталога, показанного в дереве):

binarycreator.exe --offline-only -c "installer/config/config.xml" -p "installer/packages" "$[Name]Installer_[version].exe"
person Dan Hogan    schedule 13.11.2019
comment
извините, но это опечатка в вопросе имя файла installscript.qs - person Matthijs990; 13.11.2019
comment
я не могу сделать онлайн-установщик с ним? - person Matthijs990; 14.11.2019
comment
потому что все дело в том, что я хочу сделать онлайн-установщик, а в примере они используют онлайн-установщик - person Matthijs990; 14.11.2019
comment
Я предполагаю, что это пример, которому вы следовали? doc.qt.io/qtinstallerframework/ - person Dan Hogan; 14.11.2019
comment
Ваш исходный пост не включал бит онлайн / офлайн. Тем не менее, различия минимальны, вы также используете для этого инструмент репогена, и, как вы указали в своем исправленном посте, передайте --online-only vs offline-only - person Dan Hogan; 14.11.2019
comment
hogen да это тот самый пример - person Matthijs990; 14.11.2019
comment
Сегодня вечером я посмотрю ваше репо в Интернете и посмотрю, смогу ли я заставить его работать, и обновлю его, если да. - person Dan Hogan; 14.11.2019
comment
Давайте продолжим это обсуждение в чате. - person Matthijs990; 15.11.2019
comment
а ты нашел проблему? - person Matthijs990; 16.11.2019

Я думаю, что нашел решение

open-editor поскольку имя пакета неверно, они хотят что-то вроде этого:

org.<vendor>.<name>.installer

поэтому, если вы переименуете open-editor в org.devgroup.open_editor.installer, вы получите работающий онлайн- и офлайн-установщик.

изменить:

по крайней мере на винде так

person Matthijs990    schedule 20.11.2019