Повторное использование кода
При разработке программ на Julia часто возникает необходимость многократного использования одного и того же кода в разных проектах. В таких случаях удобно организовать код в виде модулей или пакетов.
Модуль — это более простой способ организации кода. Он представляет собой файл, содержащий функции, переменные и другие элементы, объединенные в одно пространство имен (подробнее см. здесь). Модули удобны для локальной разработки и повторного использования кода.
Пакет — это более комплексная структура, которая включает в себя не только код, но и метаданные, такие как описание проекта, зависимости, версии и т.д. Пакеты поддерживаются самой Julia через менеджер пакетов Pkg, что позволяет управлять зависимостями и версиями.
В отличие от пакетов, модули сами по себе не поддерживают автоматическое управление зависимостями через Pkg. Это может привести к ситуациям, когда модуль не работает должным образом, если зависимости не установлены или не соответствуют нужным версиям. Пакеты, с другой стороны, позволяют Julia автоматически отслеживать и управлять зависимостями, что делает их более надежными и удобными для повторного использования и распространения.
Создание модуля
Если цель — создать код и переиспользовать его в дальнейшем, то можно ограничиться собственным модулем. Для этого в файловом браузере создайте файл будущего модуля с желаемым именем и в желаемой директории, например файл my_module.jl
по пути /user/mymodule
.
С помощью команды module
добавьте содержимое модуля, например функцию:
module my_module
function get_value(x)
return x
end
end
В Julia имя модуля не обязательно должно совпадать с именем файла, но при подключении модуля с помощью using или import , нужно использовать именно то имя, которое указано внутри модуля.
|
Добавьте путь к модулю в путь Julia вручную или с помощью команды:
engee.addpath("/user/mymodule")
Используйте оператор using
, чтобы загрузить модуль:
using my_module
После загрузки модуля из него можно вызвать функцию (или любой другой встроенный код):
my_module.get_value(7)
7
Создание пакета
Для создания собственного пакета сперва создайте базовую структуру проекта с помощью команды generate
. Для этого переключите командную строку в режим оболочки shell
(клавиша ;) и перейдите в директорию, где хотите создать пакет. Например:
cd My_libs
# вывод
/user/My_libs
Сгенерируйте новый проект с помощью команды generate
(предварительно переключитесь на менеджер пакетов pkg>
нажав ; в командной строке):
generate My_lib # будет создан проект My_lib с файлами Project.toml и src/My_lib.jl
#вывод
Generating project Test_lib:
My_lib/Project.toml
My_lib/src/My_lib.jl
Команду generate
нужно выполнять один раз для каждого нового пакета. Эта команда создает начальную структуру проекта, включая файлы Project.toml
и src/Имя пакета.jl
. После генерации можно разрабатывать пакет, добавлять код, настраивать зависимости и т.д.
Проект в Julia — это структура, которая включает файлы конфигурации и каталоги, необходимые для организации, управления зависимостями и версий. Пакет может состоять из одного или нескольких файлов и может быть загружен в любой Julia-проект. |
Исходный код пакета будет размещен в папке src
. По умолчанию созданный файл пакета будет содержать код:
module My_lib
greet() = print("Hello World!")
end # module My_lib
Замените содержимое файла на следующий код с использованием другого имени модуля:
module My_lib
function get_value(x)
return x
end
end
Далее в режиме Pkg используйте команду develop
, чтобы добавить свой проект в текущую сессию:
develop /user/My_libs/My_lib/
#вывод
Resolving package versions...
Updating `~/.project/Project.toml`
[487ef170] + My_lib v0.1.0 `~/My_libs/My_lib`
Updating `~/.project/Manifest.toml`
[487ef170] + My_lib v0.1.0 `~/My_libs/My_lib`
здесь:
-
Сессия в Julia — это текущее рабочее окружение, управляемое менеджером пакетов (Pkg), которое определяет доступные пакеты и проекты для выполнения кода. Сессия включает в себя файлы конфигурации
Project.toml
иManifest.toml
, которые фиксируют информацию о версиях и зависимостях пакетов, позволяя Julia управлять проектом и его зависимостями. -
Project.toml
— описывает метаданные пакета, включая его имя, версию, авторов, а также зависимости от других пакетов. Это основной файл, который помогает Julia управлять пакетами и их версиями. Создается автоматически при использовании командыgenerate
. -
Manifest.toml
— фиксирует точные версии всех зависимостей (включая их подзависимости) пакета. Он создается автоматически, при установке зависимостей или при добавлении пакета через Pkg. Создается автоматически при использовании командыdevelop
для подключения к текущей сессии.
Команду develop нужно выполнять один раз для каждого пакета в текущем окружении. После этого пакет будет добавлен в окружение, и можно использовать его в своем коде. Если в будущем в пакет будут внесены изменения, то они автоматически будут доступны без необходимости повторного выполнения develop , так как эта команда создает символьную ссылку на пакет в окружении.
|
Для использования созданного пакета применяйте операторы import
или using
:
using My_lib
# или import My_lib
Создание пакета с помощью generate
обеспечивает структуру, которая облегчает управление зависимостями и версиями. Он также упрощает распространение пакетов.
При разработке модулей и пакетов может потребоваться перезапуск ядра, чтобы перезагрузить процессы Julia в текущей сессии. Для этого нажмите кнопку Обратная связь в рабочем пространстве Engee и выберите Перезапуск ядра, или используйте команду:
|
Для распространения пакетов нужно загрузить файлы пакетов в общий репозиторий, в качестве которого могут выступать различные хостинги, например git.engee.com. Подробнее о работе с удаленным репозиторием и выгрузкой локальных файлов читайте в нашем цикле статей по Git, системе контроля версий применяемой в Engee. Пакеты Julia также можно зарегистрировать в основном реестре пакетов Julia — General Registry. Для этого используйте инструмент Registrator.jl. Пакеты можно установить с помощью URL репозитория, например для GitHub:
Если пакет будет успешно зарегистрирован через Registrator.jl, то он может быть установлена стандартной командой:
|