grig_p
grig_p31 марта 2017 г. 7:38

Вопрос по статье "Qt WinAPI - Урок 004. QtIFW ..." Ошибка в copydata

Здравствуйте! Создал проект с поддиректориями "Проект + инсталлятор", как показано в статье: https://evileg.com/post/164/ Но при сборке инсталлятора возникает ошибка [copydata] Error 4 Что это и куда копать? Вот мой код Installer.pro:

TEMPLATE = aux

# В зависимости от режима сборки, определяем, куда именно будут собираться инсталляторы
CONFIG(debug, debug|release) {
    INSTALLER_OFFLINE = $$OUT_PWD/../../TSInstallerDebug/TreeStorage.offline
    INSTALLER_ONLINE = $$OUT_PWD/../../TSInstallerDebug/TreeStorage.online
    DESTDIR_WIN = $$PWD/packages/ru.ntcmks.treestorage/data
    DESTDIR_WIN ~= s,/,\\,g
    PWD_WIN = $$OUT_PWD/../../TreeStorageDebug
    PWD_WIN ~= s,/,\\,g

    copydata.commands = $(COPY_DIR) $$PWD_WIN $$DESTDIR_WIN
    first.depends = $(first) copydata
    export(first.depends)
    export(copydata.commands)
    QMAKE_EXTRA_TARGETS += first copydata
} else {
    # Задаём переменные, которые будут содержать пути с названиями инсталляторов
    INSTALLER_OFFLINE = $$OUT_PWD/../../TSInstallerRelease/TreeStorage.offline
    INSTALLER_ONLINE = $$OUT_PWD/../../TSInstallerRelease/TreeStorage.online

    # Задаём переменную, которая должна содержать путь к папке с данными
    DESTDIR_WIN = $$PWD/packages/ru.ntcmks.treestorage/data
    DESTDIR_WIN ~= s,/,\\,g
    # Задаём путь откуда всё приложение с DLL-ками нужно будет скопировать
    PWD_WIN = $$OUT_PWD/../../TreeStorageRelease
    PWD_WIN ~= s,/,\\,g

    # Прежде, чем выполнять сборку инсталляторов, необходимо скопировать файлы
    # из выходной папки проекта вместе со всеми DLL в папку data, которая относится
    # к собираемому пакету
    copydata.commands = $(COPY_DIR) $$PWD_WIN $$DESTDIR_WIN
    first.depends = $(first) copydata
    export(first.depends)
    export(copydata.commands)
    # задаём кастомную цель сборки, при которой сначала выполним компирование файлов
    # а потом уже и остальное, что следует по скрипту QMake
    QMAKE_EXTRA_TARGETS += first copydata
}

# Создаём цель по сборке Оффлайн Инсталлятора
INPUT = $$PWD/config/config.xml $$PWD/packages
offlineInstaller.depends = copydata
offlineInstaller.input = INPUT
offlineInstaller.output = $$INSTALLER_OFFLINE
offlineInstaller.commands = $$(QTDIR)/../../QtIFW2.0.5/bin/binarycreator --offline-only -c $$PWD/config/config.xml -p $$PWD/packages ${QMAKE_FILE_OUT}
offlineInstaller.CONFIG += target_predeps no_link combine

QMAKE_EXTRA_COMPILERS += offlineInstaller

# Создаём цель по сборке Онлайн Инсталлятора
INPUT = $$PWD/config/config.xml $$PWD/packages
onlineInstaller.depends = copydata
onlineInstaller.input = INPUT
onlineInstaller.output = $$INSTALLER_ONLINE
onlineInstaller.commands = $$(QTDIR)/../../QtIFW2.0.5/bin/binarycreator --online-only -c $$PWD/config/config.xml -p $$PWD/packages ${QMAKE_FILE_OUT}
onlineInstaller.CONFIG += target_predeps no_link combine

QMAKE_EXTRA_COMPILERS += onlineInstaller

# репозиторий будем собирать только в случае режима release
CONFIG(release, debug|release) {
    # Сборку репозитория производим после того, как были собраны Инсталляторы
    # Для этого воспользуемся QMAKE_POST_LINK вместо QMAKE_EXTRA_COMPILERS
    # Поскольку он хорошо для этого подходит
    QMAKE_POST_LINK += $$(QTDIR)/../../QtIFW2.0.5/bin/repogen -p $$PWD/packages -i ru.evileg.helloinstaller --update $$OUT_PWD/../../repository
}

DISTFILES += \
    config/config.xml \
    packages/com.ntcmks.treestorage/meta/package.xml
config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>TreeStorage</Name>
    <Version>1.0.0</Version>
    <Title>1.0.0 TreeStorage Installer</Title>
    <Publisher>NtcMks</Publisher>
    <StartMenuDir>TreeStorage</StartMenuDir>
    <TargetDir>@TargetDir@/TreeStorage</TargetDir>
        <AllowSpaceInPath>true</AllowSpaceInPath>
    <RemoteRepositories>
        <Repository>
            <Url>http://www.ntcmks.ru/software/TreeStorage/</Url>
        </Repository>
    </RemoteRepositories>
</Installer>
package.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>Приложение TreeStorage</DisplayName>
    <Description>Приложение TreeStorage</Description>
    <Version>0.1.0</Version>
    <ReleaseDate>2017-03-30</ReleaseDate>
        <Default>true</Default>
    <Name>com.ntcmks.treestorage</name>
    <ForcedInstallation>true</ForcedInstallation>
    <RequiresAdminRights>true</RequiresAdminRights>
</Package>
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

16
Evgenii Legotckoi
  • 31 марта 2017 г. 9:09

Первое, что бросается в глаза, так это то, что не всю копипасту переправили. Посмотрите внимательно на этот участок кода, да и вообще весь проект внимательно пересмотрите.

CONFIG(release, debug|release) {
    # Сборку репозитория производим после того, как были собраны Инсталляторы
    # Для этого воспользуемся QMAKE_POST_LINK вместо QMAKE_EXTRA_COMPILERS
    # Поскольку он хорошо для этого подходит
    QMAKE_POST_LINK += $$(QTDIR)/../../QtIFW2.0.5/bin/repogen -p $$PWD/packages -i ru.evileg.helloinstaller --update $$OUT_PWD/../../repository
}

Ещё как вариант, может быть проблема с переменной QTDIR , если она не установлена в путях операционной системы. Ищите в настройках системы переменные среды (PATH) и проверьте, есть ли там QTDIR.

    grig_p
    • 31 марта 2017 г. 9:32

    Спасибо за ответ. Копипасту поправил.

    Посмотрел пути $$OUT_PWD Но выяснилось, что правильными путями оказались не PWD_WIN = $$OUT_PWD/../../TreeStorageDebug, а PWD_WIN = $$OUT_PWD/../TreeStorageDebug

    Поправил. Ошибка ушла.

    Но появилась другая: :-1: ошибка: [../TSInstallerDebug/TreeStorage.offline] Error 1

    Вставил в TSInstaller.pro message($$(QTDIR)/../../QtIFW2.0.5/bin/repogen)

    Выдало в сообщениях :Project MESSAGE: D:\QT\5.8\mingw53_32/../../QtIFW2.0.5/bin/repogen

    В настройках Qt в переменная QTDIR настроена правильно Заранее спасибо за совет

      Evgenii Legotckoi
      • 31 марта 2017 г. 9:37

      Относительно правильности путей, то это уже вопрос к структуре проекта.

      Что касается ошибки, то а где именно установлен QtIFW ? Пути совпадают? Или всё-таки нет?

        grig_p
        • 4 апреля 2017 г. 3:32

        Спасибо за ответ! Пути, похоже, все на месте. При сборке ошибка звучит так: :-1: ошибка: [../TSInstallerDebug/TreeStorage.offline] Error 1 Пытаюсь вывести: error($$INSTALLER_OFFLINE) Выводит: :-1: ошибка: D:\Grig\QTProjects\TreeStorageDeploy\build-TreeStorageDeploy-Desktop_Qt_5_8_0_MinGW_32bit-Debug\TSInstaller\..\TSInstallerDebug\TreeStorage.offline Папка ...\TSInstallerDebug\ имеется. TreeStorage.offline отсутствует QT установлен на D диске D:\QT QtIFW установлен внутри папки QT: D:\QT\QtIFW2.0.5 Путь $$(QTDIR)/../../QtIFW2.0.5/bin/binarycreator указывает правильно Заранее благодарен за помощь. Прикрепил проект и структуру папок.

          Evgenii Legotckoi
          • 4 апреля 2017 г. 12:34
          • Ответ был помечен как решение.

          Структура проекта несколько отличается от той, что я привёл в качестве примера в статье. Я имею ввиду структуру subdirs. Поэтому и были косяки с путями изначально.

          Что касается этой ошибки [../TSInstallerDebug/TreeStorage.offline] Error 1 , то ума не приложу, в чём причина. Я перепилил ваш проект так, что он стал идентичен тому, что приводится в качестве примера. Но мой проект, в отличие от вашего компилируется, собирает все инсталляторы и нормально работает.

          Единственное, что могу предположить, что какой-то косяк в кодировке файла и присутствует битый символ, который или не виден или идентичен русскому символу, чаще всего это буква С . Я таким сталкивался, но не в ситуации с инсталляторами. Лечение проблемы было весьма топорным, пересоздать проект заново... Благо это было на раннем этапе.

          Скачайте из статьи пример с инсталляторами (в конце статьи). Там была проблема со скачиванием, но я её пофиксил (права на чтение у файла отсутствовали)

            grig_p
            • 5 апреля 2017 г. 3:13

            Спасибо. Ваш проект скачал. Попробую.

              grig_p
              • 10 апреля 2017 г. 2:27

              Прошу прощения за поздний ответ. Был занят. Смог попробовать только сейчас. Взял Ваш проект. Ничего не меняя попытался собрать. Hello собрался без ошибок. А вот Installer выдает примерно то же самое, что у меня: :-1: ошибка: [../../InstallerDebug/Hello.offline] Error 2

                Evgenii Legotckoi
                • 10 апреля 2017 г. 2:40

                У вас какой Qt installer Framework установлен? У меня тот проект писался под QtIFW2.0.3, возможно, нужно поменять версию в installer.pro . Там в трёх строчках.

                  grig_p
                  • 10 апреля 2017 г. 4:00

                  Спасибо. Поменял путь и получилось.

                    grig_p
                    • 28 апреля 2017 г. 3:16

                    Здравствуйте!
                    Озадачился созданием online инсталляторов.
                    Я так понял, что при сборке в режиме release должны создаваться инсталляторы для режима release в папке InstallerRelease и репозиторий в папке repository на том же уровне, что и папка InstallerRelease. Я прав?
                    У меня создаются файлы Hello.offline.exe и Hello.online.exe в папке InstallerRelease, а папка repository не создается ни на одном уровне с InstallerRelease, ни на каком другом.
                    Проект использую HelloInstaller.
                    Заменил в коде Installer.pro

                    QMAKE_POST_LINK += $$(QTDIR)/../../QtIFW_2.0.5/bin/repogen -p $$PWD/packages -i ru.evileg.helloinstaller --update $$OUT_PWD/../../repository
                    на
                    onlineInstaller.commands = $$(QTDIR)/../../QtIFW2.0.5/bin/repogen -p $$PWD/packages -i ru.evileg.helloinstaller --update $$OUT_PWD/../../repository
                    Репозиторий создается, как надо.
                    В чем может быть проблема?
                      Evgenii Legotckoi
                      • 28 апреля 2017 г. 7:19

                      Больше ничего не меняли в коде? Например, url определение пакета? -> (ru.evileg.helloinstaller)

                        grig_p
                        • 28 апреля 2017 г. 7:28

                        менял только номер версии QtIFW с 2.0.3 на 2.0.5
                        Кстати, у меня в вопросе написано с ошибкой в пути.
                        Вместо QtIFW2.0.5 написано QtIFW_2.0.5 Но в этом случае должна быть ошибка сборки, а она не возникает, собирается нормально.

                          Evgenii Legotckoi
                          • 28 апреля 2017 г. 7:30

                          А в коде как написано? Также с нижним подчёркиванием? Если так, то вполне возможно, что из-за этого и не работает.

                            grig_p
                            • 28 апреля 2017 г. 7:39

                            В коде не работает как с подчеркиванием, так и без него. Причем, с подчеркиванием даже не сообщает об ошибке.

                              Evgenii Legotckoi
                              • 28 апреля 2017 г. 7:46

                              Вообще странно, должно работать. Разве только сам QMAKE чудит. Но у меня мыслей нет на этот счёт.

                                grig_p
                                • 28 апреля 2017 г. 7:51

                                Понятно. Спасибо.

                                  Комментарии

                                  Только авторизованные пользователи могут публиковать комментарии.
                                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                  AD

                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                  • Результат:50баллов,
                                  • Очки рейтинга-4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 1:37

                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                  • Результат:80баллов,
                                  • Очки рейтинга4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 1:29

                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                  • Результат:20баллов,
                                  • Очки рейтинга-10
                                  Последние комментарии
                                  ИМ
                                  Игорь Максимов22 ноября 2024 г. 11:51
                                  Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                  Evgenii Legotckoi
                                  Evgenii Legotckoi31 октября 2024 г. 14:37
                                  Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                  A
                                  ALO1ZE19 октября 2024 г. 8:19
                                  Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                  ИМ
                                  Игорь Максимов5 октября 2024 г. 7:51
                                  Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                  d
                                  dblas55 июля 2024 г. 11:02
                                  QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  Сейчас обсуждают на форуме
                                  m
                                  moogo22 ноября 2024 г. 7:17
                                  Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                                  Evgenii Legotckoi
                                  Evgenii Legotckoi24 июня 2024 г. 15:11
                                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                  t
                                  tonypeachey115 ноября 2024 г. 6:04
                                  google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                  NSProject
                                  NSProject4 июня 2022 г. 3:49
                                  Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                                  Следите за нами в социальных сетях