Документация Engee

Повторное использование кода

При разработке программ на Julia часто возникает необходимость многократного использования одного и того же кода в разных проектах. В таких случаях удобно организовать код в виде модулей или пакетов.

Модуль — это более простой способ организации кода. Он представляет собой файл, содержащий функции, переменные и другие элементы, объединенные в одно пространство имен (подробнее см. здесь). Модули удобны для локальной разработки и повторного использования кода.

Пакет — это более комплексная структура, которая включает в себя не только код, но и метаданные, такие как описание проекта, зависимости, версии и т.д. Пакеты поддерживаются самой Julia через менеджер пакетов Pkg, что позволяет управлять зависимостями и версиями.

В отличие от пакетов, модули сами по себе не поддерживают автоматическое управление зависимостями через Pkg. Это может привести к ситуациям, когда модуль не работает должным образом, если зависимости не установлены или не соответствуют нужным версиям. Пакеты, с другой стороны, позволяют Julia автоматически отслеживать и управлять зависимостями, что делает их более надежными и удобными для повторного использования и распространения.

Создание модуля

Если цель — создать код и переиспользовать его в дальнейшем, то можно ограничиться собственным модулем. Для этого в файловом браузере file browser 7 создайте файл будущего модуля с желаемым именем и в желаемой директории, например файл 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 в текущей сессии. Для этого нажмите кнопку Обратная связь kernel reboot 1 в рабочем пространстве Engee и выберите kernel reboot Перезапуск ядра, или используйте команду:

engee.clear_all()

Для распространения пакетов нужно загрузить файлы пакетов в общий репозиторий, в качестве которого могут выступать различные хостинги, например git.engee.com. Подробнее о работе с удаленным репозиторием и выгрузкой локальных файлов читайте в нашем цикле статей по Git, системе контроля версий применяемой в Engee. Пакеты Julia также можно зарегистрировать в основном реестре пакетов Julia — General Registry. Для этого используйте инструмент Registrator.jl.

Пакеты можно установить с помощью URL репозитория, например для GitHub:

using Pkg
Pkg.add("https://github.com/username/repositoryname")

Если пакет будет успешно зарегистрирован через Registrator.jl, то он может быть установлена стандартной командой:

using Pkg
Pkg.add("LibraryName")