确定特定软件包的版本

44

我该如何获取特定软件包的版本号?

显而易见的方法是获取包含所有已安装软件包信息的字典,然后过滤出所需软件包的信息:

pkgs = Pkg.installed();
pkgs["Datetime"]

获取所有已安装软件包的列表非常缓慢,尤其是在存在许多软件包的情况下。


pkgs["Datetime"] 对于我没有任何效果: Julia版本为 0.5.2. - PatrickT
6个回答

31

编辑:对于 Julia 1.1+ 版本

使用 Pkg REPL 表示法:

] status                        # Show every installed package version
] status pkgName                # Show the specific version of the package
] status pkgName1 pkgName2      # Show the named packages. You can continue the list.

] 进入 Pkg REPL,因此您可以直接编写 status ...

因此,在进入 Pkg REPL 后,您可以编写:

status DataFrame

或者使用面向对象的方法(注意:在这里您不需要进入Pkg REPL,也就是说,请勿使用]):

Pkg.status("DataFrame")

编辑:对于Julia版本1.0

Pkg.installed似乎在新的包管理系统中出现了“回归”。对于Pkg.installed没有参数。因此,目前来看,OP的原始方法似乎是最好的选择。

pkgs = Pkg.installed();
pkgs["Datetime"]

编辑:适用于Julia版本0.6.4及以下

您可以将字符串传递给Pkg.installed。例如:

pkgs = Pkg.installed("JuMP")

我经常使用methods来检查可用的调用参数。例如:

julia> methods(Pkg.installed)
# 2 methods for generic function "installed":
installed() at pkg/pkg.jl:122
installed(pkg::AbstractString) at pkg/pkg.jl:129
或者
julia> Pkg.installed |> methods
# 2 methods for generic function "installed":
installed() at pkg/pkg.jl:122
installed(pkg::AbstractString) at pkg/pkg.jl:129

2
在REPL中,您可以使用更快的方式,在左括号后键入TAB:julia> Pkg.installed(\tab - ivarne
1
我不知道。 - ivarne
1
@jangorecki,原帖中使用了Pkg.installed。在1.0.0版本中,我认为您需要先使用using Pkg - rickhg12hs
1
@jangorecki...我认为在1.0.0版本及以上的Pkg.installed可能有不同的含义。也许新的含义是“用户直接安装的包,而不是依赖项”,而不是“所有已安装的包”。我不确定,因为我仍然在v0.6.4上。 - rickhg12hs
1
@DisabledWhale 我目前不是 Julia 用户。我已将此答案重新分配给社区维基。请随时更新最新的 Julia 信息。谢谢! - rickhg12hs
显示剩余8条评论

13

我会尝试 Pkg.status("PackageName")

这将会打印出一个简短的描述来说明包的名称。

以下是一个例子:

julia> Pkg.status("QuantEcon")
 - QuantEcon                     0.0.1              master

Pkg.status("QuantEcon") 在 Julia 0.3 中会报错 ERROR: 'status' has no method matching status(::ASCIIString)。这个方法是属于特定的包吗? - Julian
1
哦,有趣。那不是该软件包的一个方法。我使用的是0.4dev版本,也许这是一个新功能。 - spencerlyon2
3
@JamesonQuinn,确实自从 Julia 1.x 版本以后需要导入 Pkg - Pierre H.
1
julia> Pkg.status("LinearAlgebra") 状态 C:\Users\joe\.julia\environments\v1.5\Project.toml [37e2e46d] LinearAlgebra 但它没有告诉我版本号。 - skan

9
在Julia 1.1中,您可以使用:
(v1.1) pkg> status "name_of_the_package"

在给定的环境中查找任何软件包的版本。

2
为了查看间接包含的软件包的版本(例如,顶级项目包括依赖于模块B的模块A,您需要了解有关模块B的信息),您必须直接从Manifest.toml中提取信息,或者您必须从Pkg中导入Context对象。
以下内容使用Julia 1.3.1完成...自那时以来,Pkg的内部可能已更改。
using Pkg
using UUIDs

ctx = Pkg.Operations.Context()

# Get the version of CSV.jl
version = ctx.env.manifest[UUID("336ed68f-0bac-5ca0-87d4-7b16caf5d00b")].version
if version <= v"0.5.24"
    # handle some uniqueness about the specific version of CSV.jl here
end

更新:或者使用包名而不是UUID(感谢@HHFox):

using Pkg

pkg_name = "Observables"
m = Pkg.Operations.Context().env.manifest

v = m[findfirst(v->v.name == pkg_name, m)].version

或者使用相同的方法来处理 Manifest.toml
using Pkg

# given the path to the Manifest.toml file...
manifest_dict = Pkg.TOML.parsefile(manifest_path)

# look for a named package like `CSV`
package_dict = manifest_dict[package_name][1]
@show package_dict

我喜欢这个解决方案。这里有一个版本,它与名称匹配而不是UUID。`using Pkg;m = Pkg.Operations.Context().env.manifest; v = m[findfirst(v->v.name=="Observables", m)].version` - HHFox

0

这段代码在评论区域中无法正常打印... 这里有一个版本,它匹配名称而不是UUID

using Pkg

m = Pkg.Operations.Context().env.manifest
v = m[findfirst(v -> v.name == "CSV", m)].version

0

对于项目文件中指定的包的依赖包,可以在包模式下使用status -m <packageName>或缩写st -m <packageName>After ]`)。

要获取完整列表,只需使用st -m

这是https://dev59.com/4F8e5IYBdhLWcg3wja1I#25641957的扩展。


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