В случае с методом #process_multiple
нам нужно будет немного улучшить наш код параллелизма, чтобы лучше поддерживать обработку исключений. Хорошей практикой считается обработка любых исключений, возникающих в волокне, внутри самого волокна.
К сожалению, на данный момент работа с каналами и волокнами находится на несколько более низком уровне, чем хотелось бы в идеале. Есть несколько выдающихся предложений, например https://github. com/crystal-lang/crystal/issues/6468, но в стандартной библиотеке еще не реализовано ничего, что позволяло бы использовать некоторые встроенные абстракции или API более высокого уровня. С другой стороны, проблема, которую мы хотим решить, довольно тривиальна.
В последней главе мы добавили отправку с использованием блока ensure
для корректной обработки контекстов сбоя, но упомянули, что эта реализация не идеальна, главным образом потому, что мы хотим иметь возможность различать контексты успеха и неудачи. Чтобы решить эту проблему, мы можем изменить канал, чтобы он принимал объединение Bool | Exception
вместо просто Bool
. Затем, снова используя короткую форму rescue
, мы можем отправить каналу возникшее исключение, заменив блок ensure
. В конечном итоге это будет выглядеть так:
channel.send true
rescue ex : Exception
channel.send ex
Подобно другим блокам восстановления, этот также будет идти сразу после channel.send true
, но перед конечным тегом блока spawn
. Затем нам нужно обновить логику получения для обработки значения исключения, поскольку в данный момент мы всегда игнорируем полученное значение. Для этого мы обновим цикл, чтобы проверить тип полученного значения, и поднимем его, если это тип Exception
:
input_args.size.times do
case v = channel.receive
in Exception then raise v
in Bool
# Skip
end
end
Теперь, когда мы вызываем исключение из волокна внутри самого метода, наш блок восстановления в методе теперь будет вызываться правильно. Полный метод #process_ multiple
находится в папке главы на GitHub: https://github.com/PacktPublishing/Crystal-Programming/blob/main/ Chapter07/process_multiple.cr.
Я обнаружил, что самый простой способ протестировать нашу логику отправки уведомлений — это передать файл, который не существует в режиме нескольких файлов. Например, запустив ./bin/transform -m .random-file.txt
должен привести к отображению уведомления, информирующего вас о том, что при попытке открыть этот файл произошла ошибка.
Резюме
Увы, мы подошли к завершению нашего проекта CLI. За последние четыре главы мы значительно улучшили приложение. В процессе работы мы также расширили наши знания о различных концепциях Crystal. Хотя это и конец этой части книги, это не обязательно должен быть конец CLI. Не стесняйтесь продолжать самостоятельно, добавляя функции по своему желанию. В конечном счете, это поможет закрепить концепции, представленные на этом пути.
В следующей части книги будут представлены некоторые новые проекты, ориентированные на веб-разработку, и будет использовано все, что вы узнали до сих пор. Он также потратит некоторое время на демонстрацию различных шаблонов проектирования, которые могут пригодиться в ваших будущих проектах. И так, чего же ты ждешь? Прежде всего нужно научиться использовать внешние проекты Crystal, также известные как шарды, в качестве зависимостей внутри вашего собственного проекта. Иди, начни!
Часть 3. Обучение на практике — веб-приложение
Эта часть продолжит парадигму «Обучение на практике» с другим распространенным типом приложений: веб-фреймворком. Эта часть будет опираться на информацию из первых двух частей. Чаще всего веб-приложение создается с помощью фреймворка. К счастью, в экосистеме Crystal есть из чего выбирать. Хотя лучшая платформа для использования варьируется от варианта использования к варианту использования, мы собираемся сосредоточиться на Athena Framework.
Эта часть содержит следующие главы:
Глава 8. Использование внешних библиотек
Глава 9. Создание веб-приложения с помощью Athena
8. Использование внешних библиотек
Уменьшение дублирования за счет совместного использования кода является практическим правилом во многих языках программирования. Сделать это в рамках одного проекта достаточно легко. Однако, когда вы хотите поделиться чем-то между несколькими проектами, это становится немного сложнее. К счастью для нас, большинство языков также предоставляют свои собственные менеджеры пакетов, которые позволяют нам устанавливать в наши проекты другие библиотеки в качестве зависимостей, чтобы использовать определенный в них код.
Чаще всего эти внешние проекты называются просто библиотеками или пакетами, но в некоторых языках для них есть уникальные имена, например драгоценные камни Ruby gems.. Crystal следует шаблону Ruby и называет свои проекты Crystal Shards. В этой главе мы собираемся изучить мир внешних библиотек, в том числе способы их поиска, установки, обновления и управления ими. Мы рассмотрим следующие темы:
• Использование Crystal Shards
• Поиск Shards
Технические требования
Требования к этой главе следующие:
• Рабочая установка Кристалла.
Инструкции по настройке Crystal можно найти в Главе 1 «Введение в Crystal».
Все примеры кода, использованные в этой главе, можно найти в папке Chapter 08 на GitHub: https://github.com/PacktPublishing/Crystal-Programming/tree/main/Chapter08.
Использование Crystal Shards
Если вы помните Главу 4 «Изучение Crystal посредством написания интерфейса командной строки», когда мы впервые создавали проект, в рамках этого процесса был создан файл shard.yml, но мы не особо вникали в то, что он собой представляет. был за. Пришло время более подробно изучить назначение этого файла. Суть в том, что этот файл содержит различные метаданные об осколке, такие как его имя, версия и какие внешние зависимости у него есть (если таковые имеются). Напомню, что файл shard.yml из этого проекта выглядел так:
name: transform
version: 0.1.0
authors:
- George Dietrich < george@dietrich.app>
crystal: ~> 1.4.0
license: MIT
targets:
transform:
main: src/transform_cli.cr
Подобно тому, как мы до сих пор взаимодействовали с нашими приложениями Crystal, используя двоичный файл Crystal, существует специальный двоичный файл для взаимодействия с Crystal Shards, метко названный Shards. Мы немного использовали это в начале проекта CLI для создания двоичного файла проекта, но он также может делать гораздо больше. Хотя команду сборки shards build
можно реплицировать с помощью нескольких команд crystal build
, команда shards
также предоставляет некоторые уникальные функции, в основном связанные с установкой, обновлением, сокращением или проверкой внешних зависимостей. Хотя файл shard.yml чаще всего создается как часть команды crystal init
, которую мы использовали несколько глав назад, он также может быть создан с помощью команды shards init
, которая будет формировать только этот файл, а не весь проект.
Говоря