У меня есть свой персональный вебсайт с флэш-карточками для изучения иностранных слов. Сделанный под меня именно так как я хочу, с алгоритмом экспоненциальных интервалов и свистелками-перделками, такими как мне надо.
Недавно я добавил генерацию картинок для слов, потому что говорят так лучше запоминается. Не ко всякому слову можно придумать картинку и никакие новые языки я сейчас не учу, так что пока еще не знаю насколько это поможет. Если преодолею свою франкофонофобию, то поучу французкий немного и выясню.
В процессе добавления новой функциональности, оказалось, что пароль к локальному тестовому пользователю я забыл. Вобще-то, я его давно забыл и локально тестировал из под админа. А сейчас вдруг решил его восстановить и нажал кнопочку «забыл пароль». И тут началось...
Выяснилось, что там где должен отсылаться е-мэйл для резета у меня заглушка. В Ажуре уже давно есть сервис для отсылки е-мэйлов, но там было всё сложно, нужно было свой домен заводить и доказывать, что ты не спаммер, поэтому я вставил заглушку и забыл про неё. Теперь я перепрочитал доки - сервис упростился. Ажур выдает системный домен и с него можно отсылать без дополнительных заморочек.
ОК. Начинаем программить. Ну то есть, тогда я еще не знал что программить придется. Думал добавлю только метод один и всё.
С Ажура можно отсылать е-мэйлы либо через SMTP, либо их клиентом в одну строчку. Микрософтовский клиент победил, SMTP клиент я даже искать не стал.
Добавил я библиотеку, а она требует фреймворк .net 6.0, а у меня .net core 2.0.
Ну ок, я как-то раз, от нечего делать попробовал проапгрейдить фреймворк, но юнит тесты упали и у меня сразу появилось что-то другое что делать. Видимо время пришло. Скачал самый новый 8.0, установил. Он, между прочим, хоть и новый, но только на два года вперед поддержку обещает.
Открываю проект в Вижуал Студии, оказывается что VS 2019, которая у меня, новый дотнет не поддерживает, нужно VS 2022. Да, раньше они каждые два года выходили, а теперь пореже и если в прошлом году VS 2024 не выпустили, значит, видимо следующая не скоро будет. Ну ладно, скачал 2022. Скачал к ней экстеншен для апгрейда дотнетовых проектов. Первый раз экстеншен крашнулся, но со второго пинка вроде заработало. Пока писал этот пост вышло обновление для этого экстеншена.
Только вот после апгрейда дот нета, web-проект не компилируется. Библиотеки настолько поменялись, что все надо по другому делать. Повозился немного и думаю, ну его нафиг, лучше сгенерирую новый проект с нуля из шаблона и перенесу туда свою функциональность.
Сгенерировал - схема хранения пользовательских эккаунтов в базе данных поменялась и нужно миграцию накатывать. Накатил... миграцию пока-что, «стограм» рано еще.
Запускаю - логин не работает, даже тот, где я пароль помню. Оказывается новый шаблон добавляет флажок, что пользователь должен подтверждать эккаунт перейдя по ссылке из е-мэйла. А может флажок и раньше был, но я его выключил из за необходимости е-мэйлы отсылать. Но теперь то я могу, теоретически. А для начала просто поставил брейк поинт в заглушке для е-мэйлов и скопипастил линк в браузер.
Подтвердил эккаунт, запускаю - не логинится. В Вижуал Студии есть кнопочка генерировать код для разных действий. В том числе для логина. Нажимаю кнопочку, оно заменяет вызов стандартной либы вызовом сгенерированного кода. Оказывается в стандартном методе есть баг. Шаблон на странице спрашивает е-мэйл, а библиотечный вызов ожидает имя эккаунта. Пофиксил код - залогинилось.
Стал переносить функцуиональность - не получается. Я выбрал не тот тип проекта. Надо было ASP.NET Core Web App (Model-View-Controller) а я забыл что у меня было при переходе с Web Forms на Razor 6 лет назад и выбрал ASP.NET Core Web App (Razor Pages). Не получается старую функциональность перенести. Стал гуглить и нашел ответ, что нужен MVC тип проекта.
Перегенирил проект с нуля опять. Опять пере-пофиксил баг с е-мэйлом в логине. Перенес функциональность из старого проекта в новый - запустилось. Миграцию базы данных почему-то не требует. Потом буду разбираться. А сейчас половина кнопочек не работает. Оказывается конвеншены по названию методов немного поменялись и если имя метода заканчивается на Async, то теперь в html урле Async надо отрезать, чтобы ссылки правильно в методы мапились. Сделал полный поиск по тексту, отрезал суффиксы везде где нашел. Функциональность вроде бы работает, но тестить надо всё.
Запускаю юнит тесты. Падают там же где и во время предыдущей попытки апгрейда. Стал выяснять. В проекте используется Entity Framework, такая штука для работы с базой данных. Старая версия, то что не могла выполнить на сервере, приносила на клиент и обрабатывала не сервером базы данных а локальным кодом. У меня там даже комментарий оставлен соответствующий. А новая версия не мухлюет, а по честному падает со словами «не шмогла». Это лечится легко, добавлением простого вызова функции. Ну и еще по мелочам, тестовая заглушка к базе данных раньше не обращала внимания на пропущенные требуемые поля, а теперь не прощает. Пофиксил всё - юнит тесты прошли.
Запускаю интеграционные тесты. Падают. Я когда-то давно срезал угол из за лени и вместо того, чтобы выделять модели в отдельный модуль, просто вставил ссылку прямо на веб проект в интеграционные тесты. А файлы конфигурации и там и там называются одинаково. Раньше почему то работало, а новый фреймворк при компиляции перетирает файл таким же файлом из другого проекта. Ну, ок переименовал appsettings.json в testsettings.json. Заодно выяснил, что новый дотнет во время компиляции генерирует ~100 фолдеров, по одному на каждый человековый язык. Нашел флажок чтобы это отключить.
Тестирую руками - в некоторых местах не работает. Сверил пофайлово, нашел джаваскрипты, которые я в первоначальный проект руками добавлял, добавил. И еще выяснилось, что новый фреймворк не работает с новым эмулятором Ажура. Нужен новый-новый эмулятор и даже к нему надо в командной строке ключик добавлять специальный.
Ну вроде запустилось. Ух ты! Но разметка поехала, иконки исчезли.
В новом шаблоне используется bootstrap 5 (css библиотека или как она там правильно классифицируется), а в старом был bootstrap 3. В новом бутстрапе многие css классы просто исчезли, включая иконки. Посидел, перелопатил всю разметку. Сайт теперь выглядит по-другому и местами разметка кривовата, но пока пойдет. Там дальше видно будет.
Подключить отсылку е-майлов, как и ожидалось, заняло минут 15 вместе с тестированием.
Теперь можно на миграцию базы данных посмотреть. Entity Framework хранит отображение схемы БД в проекте, в снэпшот файле, поэтому если меняется структура объекта хранимого в базе данных, например добавили урл картинки к карточке, то это надо отобразить еще в двух местах: в схеме базы даных и в файле снапшота. Новый проект урезал длину полей пользовательского эккаунта. Так как урезал, а не удлинил, то всё работало без миграции, но снэпшот и библиотечные классы не совпадали со схемой в базе данных, значит миграцию лучше сделать. Кроме того, новая версия поменяла путь к файлу снэпшота, поэтому старые таблицы он не видит и миграция пытается все таблицы заново создать и не работает, естественно. Скомпоновал, запустил миграцию локально. Вроде бы работает. В продакшен выкатывать пока не комфортно.
В новом дотнете включен режим проверки потенциальных нулевых указателей. Т.е. если теоретически где-то может быть неожиданный null, то выдается предупреждение. И эта штука довольно параноидальна. Пока исправлял предупреждения (ворнинги т.е.) наверное добавил несколько багов, «но это не точно» (c).
И это почти всё. К новому дотнету прилагается новая версия си шарпа, а в ней несколько новых языковых фич и Вижуал Студия показывает места в коде, где их можно использовать и даже предлагает заменить код на новый синтаксис.
Разметку немного поправил, чтобы текст по экрану сильно не скакал.
Выкатил сервис в продакшен - падает. То что я думал «лечится легко, добавлением простого вызова функции» в Ажурном SQL работает не так как в локальном. К счастью, лечится все-таки легко, только вызовом другой функции.
В итоге, что нужно сделать чтобы перейти с .net core 2.0 на .net 8.0:
Upgrade Visual Studio to 2022, install .NET Upgrade Assistant, upgrade all projects in the solution to .net 8.0, update Asp.net MVC related code, generate and fix EF DB migrations, update url schema removing Async suffixes, fix user login code, fix Entity Framework queries, fix unit tests that use UseInMemoryDatabase, fix integration tests, fix layout for Bootstrap 5, make sure no javascript files were lost, install Azurite Azure storage emulator, fix nullable related warnings, start using new C# features.
Интересно есть кто, кто до конца дочитал? А я вот это всё проделал.
Если кому надо то вот:
https://wordcards.azurewebsites.net/