确定特定包的版本

Posted

技术标签:

【中文标题】确定特定包的版本【英文标题】:Determine version of a specific package 【发布时间】:2014-10-27 10:24:59 【问题描述】:

如何获取特定包的版本号?

显而易见的方法是获取包含所有已安装包的字典,然后过滤出感兴趣的包:

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

不过,获取所有已安装包的列表非常慢,尤其是在有很多包的情况下。

【问题讨论】:

pkgs["Datetime"] 对我没有任何帮助:Julia 版本 0.5.2 【参考方案1】:

为了查看间接包含的包的版本(例如,***项目包括依赖于模块 B 的模块 A,您需要了解有关模块 B 的信息),您必须从直接Manifest.toml,或者你必须从Pkg引入Context对象。

以下是使用 Julia 1.3.1 完成的……从那时起,Pkg 的内部结构可能会发生变化。

using Pkg

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-&gt;v.name=="Observables", m)].version 的版本【参考方案2】:

嗯,这在评论部分打印得不好...... 这是一个匹配名称而不是 UUID 的版本

using Pkg

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

【讨论】:

【参考方案3】:

编辑:对于 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

【讨论】:

在 REPL 中,您可以使用更快的方式,在左括号后键入 TAB:julia&gt; Pkg.installed(\tab 我不知道。 @jangorecki OP 使用的是Pkg.installed。在 1.0.0 版本中,我想你可能需要先using Pkg @jangorecki ...我认为Pkg.installed 在1.0.0 及更高版本中可能有不同的含义。也许新的含义是“由用户直接安装的包,而不是依赖项”而不是“所有已安装的包”。肯定是 IDK,我还在 v0.6.4 上。 @DisabledWhale 我目前不是Julia 用户。我已将此答案重新分配给社区 wiki。请随时更新答案以获取最新的Julia 信息。谢谢!【参考方案4】:

Julia 1.1你可以使用

(v1.1) pkg> status "name_of_the_package"

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

【讨论】:

【参考方案5】:

我会试试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)。方法是特定包的一部分吗? 哦,有趣。那不是那个包的方法。我在 0.4dev 所以也许这是一个新功能。 @JamesonQuinn,确实因为需要导入 Julia 1.x Pkg julia> Pkg.status("LinearAlgebra") Status C:\Users\joe\.julia\environments\v1.5\Project.toml [37e2e46d] LinearAlgebra 但它没有告诉我版本。

以上是关于确定特定包的版本的主要内容,如果未能解决你的问题,请参考以下文章

是否有一个选项可以向我显示特定 npm 包的哪些语义版本将解析为?

C#获取构建中使用的浮动版本包的具体版本

在哪里可以找到 RedHat 的软件包名称和版本?

在哪里可以找到 RedHat 的软件包名称和版本?

利用Anaconda进行包版本控制

如何确定旧 npm 包版本的依赖关系