【发布时间】:2020-03-08 11:34:57
【问题描述】:
我正在为 Julia 编写一个包,我希望能够在包中打印我的包的当前版本号。我当然可以手动执行此操作,但我正在寻找一种直接从模块中读取它的方法。版本号写在 Project.toml 文件中,但我无法找到从代码中读取它的方法。有什么想法吗?
【问题讨论】:
我正在为 Julia 编写一个包,我希望能够在包中打印我的包的当前版本号。我当然可以手动执行此操作,但我正在寻找一种直接从模块中读取它的方法。版本号写在 Project.toml 文件中,但我无法找到从代码中读取它的方法。有什么想法吗?
【问题讨论】:
你可以使用类似的东西
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"
当然,一些错误处理是谨慎的,但这将为您提供实际加载的包的版本(而不是当前环境中指定的版本)。
【讨论】:
Package/src/Package.jl中定义了这个方法,那么你可以使用VersionNumber(Pkg.TOML.parsefile(joinpath(@__DIR__, "..", "Project.toml"))["version"])来代替。
可能——
using Pkg
Pkg.TOML.parse(read("Project.toml", String))["version"]
->“0.0.1”
【讨论】:
cd 到相应的目录。
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
这将为您提供当前环境中包(或其他数据)的版本(作为字符串)。但是一个包可能在堆栈中更深的环境中,所以......
【讨论】:
难道这是一个答案?
using Pkg
Pkg.project().version
v"0.1.2"
【讨论】: