На рисунке выше изображен мужчина 17 века, обедающий со всеми своими иждивенцами. У него там целая толпа. Я не знаю, разрешали ли тогда вычеты для иждивенцев, но если и делали, держу пари, это сокращало его налоги королю на несколько фартингов!

В нашу современную эпоху зависимости стали источником как большой пользы, так и больших головных болей в программном обеспечении. Включение внешних пакетов в код Julia может расширить возможности вашей программы. Вам нужно только изучить интерфейс кода, а не разрабатывать его самостоятельно, поэтому они могут значительно расширить возможности вашей программы и ускорить разработку. Однако эти пакеты также могут вызывать проблемы, если они плохо взаимодействуют с другим программным обеспечением в вашей системе. Это хорошо известная проблема «ада зависимостей». Особенно остро это становится при попытке обновить пакеты.

Менеджер пакетов Джулии помогает облегчить, по крайней мере, часть головной боли, связанной с включением внешних пакетов в ваш код. Допустим, вы хотите написать пакет, содержащий функцию, которая будет возвращать вызывающему объекту определенный «розоватый» цвет. Возможно, вы уже работали с пакетом Colors на своих графиках и хотите стандартизировать этот конкретный цвет в нескольких разных местах вашей программы. Мы создадим новый пакет под названием Pinkish, который будет делать именно это. См. мой предыдущий пост для руководства по созданию простого пакета.



Сначала используйте функцию generate Менеджера пакетов, чтобы создать базовый код для вашего нового пакета под названием Pinkish:

$ cd ~
$ mkdir packages
$ cd packages
$ julia
julia> ]
pkg> generate Pinkish

Затем выйдите из Джулии. Приведенные выше команды описывают метод создания базовой структуры нового пакета (обратите внимание, что «$» указывает на командную строку Linux, «julia›» — это Julia REPL, а «pkg›» — Pkg REPL). Поместите следующий код в файл Pinkish/src/Pinkish.jl:

module Pinkish

export get_pinkish()
get_pinkish() = Colors.color_names[“hotpink1”]

end  # module Pinkish

Давайте посмотрим, что произойдет, если вы запустите Julia REPL и попытаетесь использовать этот пакет:

$ julia
julia> ]
pkg> develop ~/packages/Pinkish
julia> using Pinkish

Пока все хорошо, но что происходит, когда вы вызываете новую функцию?

julia> get_pinkish()
ERROR: UndefVarError: Colors not defined
Stacktrace:
 [1] get_pinkish()
   @ Pinkish ~/packages/Pinkish/src/Pinkish.jl:7
 [2] top-level scope
   @ REPL[3]:1

Хм? Пишет, что Colors не определены, но проверяя статус ваших посылок, вы видите, что они есть. Что происходит?

Проблема в том, что Colors определен в REPL, который вы используете, но не в проекте пакета. Есть две вещи, которые вам нужно сделать, чтобы исправить это. Сначала отредактируйте Pinkish/src/Pinkish.jl и добавьте оператор using Colors в код модуля пакета:

module Pinkish

using Colors
export get_pinkish()
get_pinkish() = Colors.color_names[“hotpink1”]

end  # module Pinkish

Второй шаг — добавить пакет Colors в среду для пакета Pinkish. Когда вы создали пакет Pinkish, диспетчер пакетов создал новую среду, которая ничего не наследует от среды Julia, которая использовалась для ее создания. Дело в том, что вам придется добавить пакет Colors в среду Pinkish, чтобы получить к нему доступ. Это достигается с помощью следующих шагов:

$ cd ~/packages
$ julia
julia> ]
pkg> activate Pinkish
pkg> add Colors

Теперь полностью выйдите из Джулии и перезапустите ее. Вот и все! Вы должны получить доступ к своей новой функции.

$ julia
julia> ]
pkg> develop ~/packages/Pinkish
julia> using Pinkish
julia> get_pinkish()
(255, 110, 180)

На этот раз это сработало, возвращая значения RGB розоватого цвета. Задача решена!