Миграция на QPalette 7.0
Новая версия QPalette использует версию Angular 17 и PrimeNG 17. Остальные зависимости также обновлены до последних совместимых версий.
Подготовьте окружение
Для перевода продукта на новую версию Q.Palette потребуются:
- NodeJS версии 20.11.1 или выше.
- NPM версии 10.2.4 или выше (входит в NodeJS 20.x).
Обновите NodeJS и NPM
-
Установите nvm (для Windows (opens in a new tab), для MacOS/Linux (opens in a new tab)) для удобного переключениям между разными средами NodeJS. Это также позволит сохранить текущую установленную версию NodeJS.
-
Установите NodeJS выбранной вами версии с помощью nvm (чтобы в дальнейшем можно было к ней легко вернуться при необходимости), например:
nvm install 20.11.1 # для примера, укажите вашу текущую версию
-
Установите NodeJS версии 20.11.1 и переключитесь на неё с помощью nvm:
nvm install 20.11.1 nvm use 20.11.1
-
Убедитесь, что установлены корректные версии NodeJS и NPM:
node -v # v20.11.1 (или выше) npm -v # 10.2.4 (или выше)
-
После установки окружений все ранее установленные “глобальные” зависимости перестанут работать, необходимо установить их заново (для всех версий NodeJS, установленных через nvm). В частности, потребуется Angular CLI, установите его командой:
npm install -g @angular/cli@17
Для пользователей MacOS/Linux
Обратите внимание, что команда nvm use <version>
по умолчанию действует только внутри того терминала, в котором выполняется эта команда. Каждый новый открытый терминал будет активировать первую установленную версию. Чтобы задать версию по умолчанию для каждого нового терминала, можно воспользоваться командой:
nvm alias default 20.11.1 # будет использоваться 20.11.1
Для пользователей Windows
Обратите внимание, что команда nvm use <version>
повлияет на все консоли, открытые в данный момент и которые будут открыты в дальнейшем.
Для пользователей Windows 7
Последняя поддерживаемая Windows 7 версия NodeJS - 13.13. Если нет возможности обновить Windows до последних версий, есть 2 варианта:
- Использовать виртуальную машину или докер-образ (opens in a new tab) с новой версией NodeJS.
- Воспользоваться обходным решением, описанным на странице GitHub (opens in a new tab), однако гарантировать корректную работу такой конфигурации нельзя.
Выполните миграцию проекта
Установите внутренний репозиторий NPM
Добавьте в корень проекта файл .npmrc
со следующим содержимым:
registry=https://registry.npmjs.org
@diasoft:registry=http://repolib-main.diasoft.ru:8081/repository/npm-public-and-diasoft
Это временное решение на период миграции гарантирует, что пакеты @diasoft/*
будут ставиться из внутреннего репозитория компании, а все остальные - из публичного.
Установка пакетов из публичного репозитория, которых нет во внутреннем, вызовет проблемы в пайплайне. Поэтому перед тем, как запускать сборку в пайплайне, обратитесь к Игорю Ильичу (iilich@diasoft.ru) для загрузки недостающих версий пакетов во внутренний репозиторий.
Подготовьте терминал
С осторожностью запускайте команды NPM (в том числе сборку) из сред IDE, так как они могут использовать другую версию NodeJS! Предпочтительный способ запуска команд в рамках данной инструкции - через терминал.
Перед тем, как выполнять команды, приведенные в данной инструкции, сделайте следующее:
- откройте терминал;
- перейдите в корень проекта (где находится файл
package.json
); - убедитесь, что используется нужная версия NodeJS:
nvm use 20.11.1 # Now using node v20.11.1 (npm v10.2.4)
- очистите кэш NPM:
npm cache clean --force
Обновите зависимости
Замените версию библиотек QPalette на 7.3.9
или выше см. какая версия актуальна на данный момент:
"@diasoft/qpalette-auth": "7.3.9",
"@diasoft/qpalette-core": "7.3.9",
"@diasoft/qpalette-dashboard": "7.3.9",
"@diasoft/qpalette-file-viewer": "7.3.9",
"@diasoft/qpalette-form-addons": "7.3.9",
"@diasoft/qpalette-form-flow": "7.3.9",
"@diasoft/qpalette-permissions": "7.3.9",
"@diasoft/qpalette-prime": "7.3.9",
"@diasoft/qpalette-table-addons": "7.3.9",
"@diasoft/qpalette-ui-grid": "7.3.9",
"@diasoft/qpalette-updater": "7.3.9",
"@diasoft/qpalette-urls": "7.3.9",
"@diasoft/qpalette-urls-addons": "7.3.9",
"@diasoft/qpalette-visual": "7.3.9",
Обратите внимание, что в Вашем проекте могут быть не все эти билииотеки
Обновите Angular. Сейчас система стабильно работает на версииях пакетов 17.3.7. На всякий случай можете свериться с package.json нашей документации (opens in a new tab):
ng update @angular/core@16 @angular/cli@16 --force --allow-dirty
ng update @angular/core@17 @angular/cli@17 --force --allow-dirty
ng update @angular/cdk@16 --force --allow-dirty
ng update @angular/cdk@17 --force --allow-dirty
Запустите ng update
без указания пакетов:
ng update
Посмотрите, какие зависимости еще требуют обновления и обновите их:
ng update <package1> <package2> --force --allow-dirty
Collection does not have a schematics map
Если вы видите подобное сообщение в результате выполнения ng update
- не беспокойтесь, какая-то зависимость не имеет встроенных миграций, просто проигнорируйте.
Запустите ng update
без параметров. Если все пакеты обновлены - команда выведет сообщение:
We analyzed your package.json and everything seems to be in order. Good work!
В результате выполнения команд ng update
в вашем коде могут появиться изменения - не забудьте их закоммитить:
git commit "Применение миграций"
Установите npm-check-updates (opens in a new tab) и запустите его:
ncu -u
После этой команды могут появиться конфликты версий. Их необходимо исправить вручную.
Установите зависимости:
npm i
Если есть конфликты - установите совместимые версии, указанные в ошибках NPM.
Проверьте, что зависимости есть во внутреннем репозитории
После того как все зависимости установлены и мы убедились, что все работает, нужно:
-
Удалить
package-lock.json
иnode_modules
. -
Почистить кэш npm:
npm cache clean --force
. -
Заменить в
.npmrc
адрес репозитория:registry=http://repolib-main.diasoft.ru:8081/repository/npm-public-and-diasoft
-
Сделать
npm i
и закоммитить полученныйpackage-lock.json
.
В этом случае NPM должен поставить только те версии, которые есть во внутреннем репозитории.
Если NPM сообщит, что каких-то версий зависимостей не хватает, то нужно выполнить следующие действия:
- Прислать
package.json
на почтуiilich@diasoft.ru
с просьбой загрузить пакеты, либо дать доступ к средству загрузки в Nexus. - После загрузки пакетов в Nexus запустить
npm i
еще раз и закоммитить полученныйpackage-lock.json
.
Проверьте сборку
Запустите сборку и проверьте корректность работы приложения.
Исправьте Jenkinsfile
Пропишите в Jenkinsfile
параметр:
pipelineParameters.put("pbcui_nvm_node_version", "18")
pipelineParameters.put("pbcui_repository_rootapp_branch", "master")
Если вы остаетесь на 6-й версии QPalette, исправьте параметр pbcui_repository_rootapp_branch
:
pipelineParameters.put("pbcui_repository_rootapp_branch", "sup/6.0")
Работа продуктов на 7-й версии Q.Palette в рутовом приложении версии ниже 7-й не гарантируется! В такой конфигурации некоторые функции (в частности, технология Single Bundle) могут быть недоступны. При этом рутовое приложение версии 7.x сохраняет обратную совместимость с продуктами версии ниже 7-й.
Обратите внимание, что при подключении продуктов на 7-й версии Q.Palette в другие продукты на 7-й версии Q.Palette, они должны быть не ниже версии 7.3.3.
Исправьте Dockerfile-pbcui.txt
Пропишите базовый образ:
FROM registry-new.diasoft.ru/release/qpalette:24100914
Дополнительно
Проверьте инструкции по миграции Angular
Зайдите в руководство по миграции Angular (opens in a new tab), выберите в поле From v.
текущую версию (для версии QPalette 6.x это 15.0
), в поле To v.
версию 17.0
и убедитесь, что выполнены все инструкции, помимо тех, что были выполнены ранее.
Большая часть изменений выполняется апдейтером автоматически.
Обратите внимание на критичные изменения, помеченные как “breaking changes” и сделайте необходимые правки в своем продукте, если требуется.
Исправьте ошибки Typescript
В новой версии произошла миграция на Typescript 5.2.2. Если после миграции появляются ошибки, связанные с несоответствием типов, сделайте следующее:
- Установите
strict
в файлеtsconfig.json
в значениеfalse
. - Если ошибки все равно возникают - исправьте их.
Однако помните, что рекомендацию из п. 1 стоит рассматривать лишь как временную.
Ошибки компилятора могут говорить о неправильно подобранных интерфейсах, логических ошибках и угрозах безопасности, что может привести к серьезным проблемам в будущем.
Проверьте зависимости CommonJS и AMD
При сборке могут выводиться предупреждения типа:
<library> depends on <dependency>. CommonJS or AMD dependencies can cause optimization bailouts
Это говорит о том, что библиотека <library>
зависит от библиотеки <dependency>
, которая собрана в формате CommonJS или AMD, что будет замедлять сборку и увеличивать размер бандла.
Чтобы избавиться от предупреждений - добавьте указанные зависимости в поле architect.build.options.allowedCommonJsDependencies
конфигурации продукта в angular.json
:
"allowedCommonJsDependencies": [
"<dependency>"
...
],
Breaking Changes
Параметр bundleUrl
метода QEventsService.openNewTab()
может вызывать проблемы
Ранее при открытии страниц библиотечного продукта через openNewTab()
необходимо было указывать bundleUrl
бандла библиотечного продукта.
import { QEventsService } from '@diasoft/qpalette-visual';
import {Component} from "@angular/core";
@Component({
// ...
})
export class GetPropertiesComponent {
constructor(private readonly eventsService: QEventsService) {
this.eventsService.openNewTab({
caption: 'Название вкладки',
url: '/interface/service/component/route?query=param', // страница продукта, в который подключается библиотечный продукт
bundleUrl: '/api/some/route/to/bundle/main.js' // бандл библиотечного продукта, вызовет проблемы
});
}
}
В новых версиях bundleUrl
в таком случае сломает открытие страницы. Необходимо убрать bundleUrl
, а в продукте-потребителе сделать страницу с
адресом, который был передан в качестве url
. На этой странице подключить бандл библиотечного продукта уже с указанием этого bundleUrl
:
<q-web-component
[endpoint]='endpoint'
bundleUrl='/api/some/route/to/bundle/main.js'
></q-web-component>
endpoint = {
service: 'service',
component: 'component',
route: 'route?query=param',
caption: 'Название вкладки',
properties: {
// Здесь можно передать какие-то параметры, необходимые для инициализации библиотечного PBC
}
};
Deprecations
См. актуальные способы работы с передаваемыми данными веб-компонентов в анонсе версии 7.3.9.
Изменения в Angular и PrimeNG
Angular
Проверьте руководство по миграции Angular (opens in a new tab) на предмет изменений, включая breaking changes.
PrimeNG
Изменения см. тут (opens in a new tab).
Breaking changes, известные на текущий момент:
- Компонент
p-badge
больше не имеет значенияsmall
для свойстваsize
. Для задания значенияsmall
используйте[size]="null”
или не указывайте[size]
вообще. - Компонент
p-virtualScroller
больше не имеет свойстваrows
, количество строк рассчитывается автоматически по высоте родительского контейнера, получить текущее значение можно вevent.rows
событияonLazyLoad
.
Если есть проблемы с загрузкой бандлов
Убедитесь, что нет дублей QWebComponentModule.forRoot()
(см. BREAKING CHANGES в анонсах 7.3.5 и 7.3.11).
Убедитесь, что в главном компоненте вашего продукта (который наследует QWebComponent
) в случае наличия хуков Angular вызван дочерний метод с помощью super
(см. BREAKING CHANGES в анонсе 7.3.6).
Если проблема сохраняется – воспользуйтесь функцией логирования (см. анонсы выпусков 7.3.8 и 7.3.10).