Могу ли я сделать пакет Julia, содержащий несколько модулей, которые можно импортировать независимо?

Один из проектов, над которым я работаю, имеет четыре различных модуля (Foo, Bar, Baz, а также Plotting) и мне было поручено объединить их в пакет. В Юлии достаточно просто сделать новый пакет:

julia> Pkg.generate("MyPackage", "MIT")

Я скопировал свои модули в ~/.julia/v0.3/MyPackage/src/ и добавил включать заявления в MyPackage.jl, Это выглядит примерно так:

module MyPackage

include("foo.jl")
include("bar.jl")
include("baz.jl")
include("plotting.jl")

end

Каждый включенный файл содержит соответствующий модуль.

Моя главная проблема с этим Plotting импортирование занимает вечность, и это не нужно очень часто, когда мы используем остальную часть MyPackage, Я бы очень хотел иметь возможность сделать что-то вроде using MyPackage.Foo просто получить Foo (и особенно, чтобы исключить Plotting и его медленное время импорта). Я попробовал несколько разных подходов к тому, как я структурирую вещи, в том числе наличие субмодулей, явно определенных внутри MyPackage.jl вместо того, чтобы в каждом файле отдельно, но независимо от того, что я пытаюсь, я всегда получаю задержку загрузки от Plotting,

Можно ли собрать пакет, чтобы вы могли независимо загружать модули из него? и если да, то как?

Примечание: я новичок в Юлии и еще новее в создании пакетов. Извините, если какая-либо из моих семантик неверна или что-то неясно.

2 ответа

Решение

Попробуйте Требуется.jl:

Requires is a Julia package that will magically make loading packages faster, maybe. It supports specifying glue code in packages which will load automatically when a another package is loaded, so that explicit dependencies (and long load times) can be avoided.

Можно ли собрать пакет, чтобы вы могли независимо загружать модули из него? и если да, то как?

Следование совету этого комментария сработало для меня: https://discourse.julialang.org/t/multiple-modules-in-single-package/5615/7?u=nhdaly

Вы можете изменить модуль с именем пакета верхнего уровня, просто выставив остальные четыре модуля следующим образом:

# <julia_home>/MyPackage/src/MyPackage.jl
module MyPackage
push!(LOAD_PATH, @__DIR__) # expose all other modules defined in this directory.
end

Затем, чтобы импортировать другие модули, скажем, Barкод пользователя будет делать:

# code.jl
using MyPackage; using Foo;
...

Но стоит отметить, что Foo, Bar, Baz а также Plotting все они также рассматриваются как модули верхнего уровня, поэтому вам нужно сделать их имена уникальными, чтобы они не конфликтовали с другими пакетами / модулями. (то есть что-то вроде MyPackageFooне Foo.)

Другие вопросы по тегам