获取我的模块版本号的方法 - Julia

6

我正在为Julia编写一个包,在这个包中,我想能够打印出我的包的当前版本号。当然,我可以手动完成这项任务,但我正在寻找一种直接从模块中读取它的方法。版本号写在Project.toml文件中,但我还没有找到从代码中读取它的方法。有什么好的想法吗?

4个回答

6

你可以使用类似的东西

julia> using Pkg

julia> loadedversion(m::Module) =  VersionNumber(Pkg.TOML.parsefile(joinpath(string(first(methods(m.eval)).file), "..", "..", "Project.toml"))["version"])
loadedversion (generic function with 1 method)

julia> loadedversion(Atom)
v"0.12.8"

当然,进行一些错误处理是很明智的,但这将为您提供实际加载的软件包版本(而不是当前环境中指定的版本)。


我猜这个方法在我的模块之外也可以工作,但我想在模块内部访问它。例如,这样我就可以在我的模块日志中打印当前版本号。 - dpac
如果您在 Package/src/Package.jl 中定义了此方法,则可以使用 VersionNumber(Pkg.TOML.parsefile(joinpath(@__DIR__, "..", "Project.toml"))["version"]) - pfitzseb

2
可能 -
using Pkg
Pkg.TOML.parse(read("Project.toml", String))["version"]

-> "0.0.1"


我尝试过这个,但它读取的 Project.toml 文件属于调用函数。这意味着它会读取调用我的模块的代码的假设项目文件。 - dpac
@dpac,只需cd到适当的目录。 - PatrickT

1

这是一个答案吗?

using Pkg
Pkg.project().version

v"0.1.2"

是的,我认为这是一个很好的答案!看起来这个功能是在Julia 1.4中新增的。谢谢! - NHDaly

1
using Pkg
function pkginfo(pkgname::AbstractString, key = "version")
    # Check if Package Project
    proj = Pkg.TOML.parsefile(Base.current_project()) 
    proj["name"] == pkgname && return proj[key]
    
    # If not in Project, pkgname must be in deps. Look in Manifest.toml
    # An error will be thrown if Manifest.toml is missing
    man = Pkg.TOML.parsefile(joinpath(Base.current_project() |> dirname, "Manifest.toml"));
    for (pkg, info) in man
        pkginfo = info |> first # Play with 'man' to see why
        pkg == pkgname && return pkginfo[key]
    end
end

这将为您提供当前环境中包(或其他数据)的版本(作为字符串)。但是,该包可能在堆栈中更深的环境中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接