Разработка пакетов
Пример
Пример пакета можно посмотреть по адресу https://github.com/JuliaLang/Example.jl
Ориентируясь на его структуру, вы можете создать свой пакет.
Вариант "просто файлом"
Если вам нужно создать модуль для решения конкретной текущей задачи, то вам не нужно создавать пакет: вы можете создать файл имя_модуля.jl
со всеми объявлениями внутри module имя_модуля ... end
и разместить этот файл в любом удобном месте, например в текущем каталоге, не создавая никаких папок вокруг него. Для его подключения останется или установить переменную окружения JULIA_LOAD_PATH="."
или в тексте программы добавить путь поиска push!( LOAD_PATH, ".")
. После чего можно делать import имя_модуля
или using имя_модуля
.
Вариант "отдельный каталог"
Отдельный каталог, организованный вручную, удобен тем, что при переходе на новую версию Julia не потребуется переустановка ваших пакетов. Вторая причина сделать это - каталог со своими библиотеками можно расположить на общем ресурсе, чтобы иметь к нему доступ с нескольких машин. Особенно, если они не имеют доступа в интернет.
- Создайте папку
lalala/MyJuliaPackages
для всех своих библиотек, гдеlalala
- как вы поняли, путь доMyJuliaPackages
. - В
MyJuliaPackages
создайте папкуMyPackage1
для модуляMyPackage1
. - В ней создайте папки
src
иtest
. (test
- пока создавать необязательно. Она нужна, по соглашению, для хранения тестов пакета.) - В папке
src
создайте файлMyPackage1.jl
. - В нем напишите:
module MyPackage1
f(x)=x+1
export ff
ff(x) = x*2
end # of module
- Теперь запустите
julia
, задав, предварительно переменную окружения JULIA_LOAD_PATH, указывающую на верхний уровень, где лежат все ваши модули:
JULIA_LOAD_PATH=lalala/MyJuliaPackages julia
При задании этой переменной окружения можно использовать относительный путь и, даже, ~
(домашний каталог пользователя в Linux), главное, чтобы он правильно указывал, относительно пути, откуда запущена Julia. Если в программе или REPL планируется смена текущего каталога командой cd()
, то нужно будет сделать все необходимые use
или import
своих пакетов до смены текущего каталога.
- в
REPL
должны быть доступны следующие обращения к этому модулю:
using MyPackage1
julia> MyPackage1.f(3)
4
julia> ff(3)
6
Перед определениями функций, если они - часть интерфейса, хорошо бы написать документацию по ним, например:
"""
f(x) -> my simple but cool summator.
"""
f(x)=x+1
после изменения исходников, перезапустите REPL и наберите:
using MyPackage1
?> MyPackage1.f # - поставить знак вопроса в начале строки
вы увидите документацию по указанной функции.
Некоторые часто используемые инструкции можно поместить в ключ -e
, при запуске julia:
JULIA_LOAD_PATH=lalala/MyJuliaPackages julia -e'using MyPackage1' -i
Вариант работы с Pkg и PkgDev
Предполагается, что вы умеете работать с git и имеете аккаунт на github.
Настроить:
$ git config --global user.name "FULL NAME"
$ git config --global user.email "EMAIL"
[ $ git config --global github.user "USERNAME" ]
Установить PkgDev
:
Pkg.add("PkgDev"); import PkgDev
Сгенерировать структуру каталогов ~/./julia/vXX/FooBar:
PkgDev.generate("FooBar","MIT")
В папке ~/.julia/git
.
Далее как обычно, работаем с git
.
Работать с git
, можно не выходя из REPL
:
julia> cd(Pkg.dir("Many"))
shell> mcedit src/Many.jl
shell> git <command>
После того, как ваш пакет появится на github, его уже можно установить с помощью Pkg
(используется clone
, не add
), например:
Pkg.clone("git://github.com/yourname/MyFirstPackage.jl.git")
Разработанный и доступный на github пакет, может быть зарегистрирован в https://github.com/JuliaLang/METADATA.jl по запросу. После этого он станет доступен для установки по простому имени, например:
Pkg.add("Lazy")
Удалить пакет можно командой rm
:
Pkg.rm("Lazy")
Разумеется, пакет должен быть качественным, с тестами и заполненным файлом REQUIRE
, если он имеет зависимости.