Могу ли я сделать пакет 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
.)