Миграция на 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-dirtyCollection 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).