我可以制作一个包含多个可以独立导入的模块的 Julia 包吗?

Can I make a Julia package containing multiple modules that can be independently imported?

我合作的其中一个项目有四个不同的模块(FooBarBazPlotting),我的任务是将它们组合成一个包。在 Julia 中创建一个新包非常简单:

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

我将我的模块复制到 ~/.julia/v0.3/MyPackage/src/ 并向 MyPackage.jl 添加了 include 语句。它看起来像这样:

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.

是否可以构建一个包以便您可以从中独立加载模块?如果是,怎么做?

注意:我是 Julia 的新手,而且还是构建包的新手。对不起,如果我的语义有误或不清楚。

尝试 Requires.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.

Is it possible build a package so you can independently load modules from it? and if so, how?

遵循此评论的建议对我有用: 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;
...

但值得注意的是,FooBarBazPlotting也都被视为顶级模块,因此您将想让他们的名字独一无二,这样他们就不会与其他 Packages/Modules 冲突。 (即类似于 MyPackageFoo,而不是 Foo。)