安装多个软件包时出现 Julia“检测到软件包无法满足的要求”错误

Gno*_*chi 3 julia ijulia-notebook

我正在使用 Julia v1.5.2,当我尝试安装 EvalMetrics 时出现以下错误:

\n

Pkg.add("EvalMetrics")

\n

我什至尝试使用 Pkg 管理器而不是使用 import Pkg,但它似乎也没有什么区别。

\n
Unsatisfiable requirements detected for package StatsBase [2913bbd2]:\n StatsBase [2913bbd2] log:\n \xe2\x94\x9c\xe2\x94\x80possible versions are: 0.24.0-0.33.19 or uninstalled\n \xe2\x94\x9c\xe2\x94\x80restricted to versions * by an explicit requirement, leaving only versions 0.24.0-0.33.19\n \xe2\x94\x9c\xe2\x94\x80restricted by compatibility requirements with JuliaDB [a93385a2] to versions: 0.24.0-0.32.2\n \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80JuliaDB [a93385a2] log:\n \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80possible versions are: 0.9.0-0.13.1 or uninstalled\n \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80restricted to versions * by an explicit requirement, leaving only versions 0.9.0-0.13.1\n \xe2\x94\x94\xe2\x94\x80restricted by compatibility requirements with EvalMetrics [251d5f9e] to versions: 0.33.0-0.33.19 \xe2\x80\x94 no versions left\n   \xe2\x94\x94\xe2\x94\x80EvalMetrics [251d5f9e] log:\n     \xe2\x94\x9c\xe2\x94\x80possible versions are: 0.1.0-0.2.1 or uninstalled\n     \xe2\x94\x94\xe2\x94\x80restricted to versions 0.1.1 by an explicit requirement, leaving only versions 0.1.1\n
Run Code Online (Sandbox Code Playgroud)\n

当我尝试更新时StatsBase,它是最新的,我得到了这个:

\n
Updating registry at `~/.julia/registries/General.toml`\n  No Changes to `~/.julia/environments/v1.7/Project.toml`\n  No Changes to `~/.julia/environments/v1.7/Manifest.toml` \n
Run Code Online (Sandbox Code Playgroud)\n

Nil*_*dat 5

首先我会说不要使用 Julia 1.5.2 - 当前的稳定版本是 1.7.3,我们很快就会得到 1.8.0,通常建议使用最新的稳定版本(或如果您不想对环境进行任何更改但仍收到错误修复,则可以选择 LTS)。

\n

也就是说,您看到的错误与 Julia 版本无关。这是一个干净的临时环境中的最小重现器 ( ] activate --temp):

\n
(jl_0jYGBJ) pkg> add JuliaDB EvalMetrics\n   Resolving package versions...\nERROR: Unsatisfiable requirements detected for package StatsBase [2913bbd2]:\n StatsBase [2913bbd2] log:\n \xe2\x94\x9c\xe2\x94\x80possible versions are: 0.24.0-0.33.19 or uninstalled\n \xe2\x94\x9c\xe2\x94\x80restricted by compatibility requirements with JuliaDB [a93385a2] to versions: 0.24.0-0.32.2\n \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80JuliaDB [a93385a2] log:\n \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80possible versions are: 0.9.0-0.13.1 or uninstalled\n \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80restricted to versions * by an explicit requirement, leaving only versions 0.9.0-0.13.1\n \xe2\x94\x94\xe2\x94\x80restricted by compatibility requirements with EvalMetrics [251d5f9e] to versions: 0.33.0-0.33.19 \xe2\x80\x94 no versions left\n   \xe2\x94\x94\xe2\x94\x80EvalMetrics [251d5f9e] log:\n     \xe2\x94\x9c\xe2\x94\x80possible versions are: 0.1.0-0.2.1 or uninstalled\n     \xe2\x94\x94\xe2\x94\x80restricted to versions * by an explicit requirement, leaving only versions 0.1.0-0.2.1\n
Run Code Online (Sandbox Code Playgroud)\n

鉴于这些unsatisfiable requirements错误相当常见,我将尝试逐步查看错误消息,因为它有时会让新用户难以解析,然后再讨论可能的解决方法并在最后评论您的特定版本冲突。

\n

了解错误消息

\n

这里发生了什么事?我正在尝试将JuliaDB和添加EvalMetrics到这个新环境,因此 Pkg 解析器尝试确定两个可以一起工作的软件包的最新版本。在这种情况下,尝试失败 - 没有可以共存的兼容JuliaDB版本EvalMetrics。这是因为它们都依赖于StatsBase该包,但需要不重叠的版本号。以下是阅读错误消息的方法:

\n
 StatsBase [2913bbd2] log:\n \xe2\x94\x9c\xe2\x94\x80possible versions are: 0.24.0-0.33.19 or uninstalled\n
Run Code Online (Sandbox Code Playgroud)\n

这只是告诉我们版本 0.24 到 0.33.19 存在于常规注册表中并且可以安装。

\n

接下来,该消息告诉我们添加到环境中的不同软件包允许哪些版本:

\n
 \xe2\x94\x9c\xe2\x94\x80restricted by compatibility requirements with JuliaDB [a93385a2] to versions: 0.24.0-0.32.2\n
Run Code Online (Sandbox Code Playgroud)\n

soJuliaDB最多适用于StatsBase0.32.2 版本,并且不接受任何较新的版本。

\n

下一部分告诉我们对其安装JuliaDB本身的限制:

\n
 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80JuliaDB [a93385a2] log:\n \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80possible versions are: 0.9.0-0.13.1 or uninstalled\n \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80restricted to versions * by an explicit requirement, leaving only versions 0.9.0-0.13.1\n
Run Code Online (Sandbox Code Playgroud)\n

这只是告诉我们 JuliaDB 有 0.9-0.13.1 版本可用,并且我们要求JuliaDB安装任何版本(restricted to versions * by an explicit requirement意味着允许所有版本,但必须按照我们明确要求安装软件包)。

\n

所以我们有 required JuliaDB,并JuliaDB告诉我们它仅适用StatsBase于 0.32.2 版本。为什么这是个问题?查看错误的下一部分:

\n
\xe2\x94\x94\xe2\x94\x80restricted by compatibility requirements with EvalMetrics [251d5f9e] to versions: 0.33.0-0.33.19 \xe2\x80\x94 no versions left\n
Run Code Online (Sandbox Code Playgroud)\n

EvalMetrics仅适用于StatsBase0.33.0 及更高版本 - 这是JuliaDB.

\n

解决方法

\n

那么该怎么办呢?从您的问题中尚不清楚,但是当用户将他们正在安装的所有软件包转储到默认环境中((@v1.5)在您的情况下)时,这些错误经常出现。随着默认环境中包数量的增加,任何两个包共享某些依赖项并需要该依赖项的不兼容版本的可能性也会增加。

\n

因此,第一个“解决方法”是在项目特定环境中工作 - 这里的 Pkg.jl 文档中有一个很好的解释。简而言之,为您正在进行的任何分析创建一个新文件夹,并] activate .在该文件夹中执行操作以启动一个新环境,您只需在其中添加该分析所需的特定包。(这样做还有其他好处,最重要的恕我直言是分析的可重复性,但这些与您的问题无关)。

\n

在这种情况下,如果你实际上不需要JuliaDBEvalMetrics同时,你可以只创建两个环境并避免冲突。

\n

如果您确实需要两个彼此不兼容的软件包怎么办?在这种情况下,需要放宽其中一个软件包的兼容性要求(通常称为“提高软件包的兼容性边界”)。有两种方法可以实现此目的:

\n
    \n
  1. 最简单的方法(虽然可能需要一段时间!)是在所涉及的软件包之一的存储库上提交问题。在这种情况下,它可能是 JuliaDB,而且实际上这个问题已经存在(稍后会详细介绍)

    \n
  2. \n
  3. 更困难(但可能更快)的方法是自己做 - 通常包不会受到其依赖项之一的版本更改的影响,因为它们实际上并不依赖于更新中中断的依赖项的功能。要检查是否是这种情况,您可以]dev打包并更新依赖项,然后查看是否仍然有效。如果没有,您可以尝试根据需要更新软件包,并制作 PR 以将您的更改上传到上游。我不会假装这很简单,或者是 Julia 用户所期望的“正常”事情,但我会说开发 Julia 包相对容易(因为大多数东西都是用 Julia 编写的,没有隐藏的东西) C/C++ 代码(例如 R/Python 中的 C/C++ 代码),并且社区很可能会很好地接受新用户的这种尝试,并在他们可以帮助您的地方提供帮助 - 如果您遇到困难,只需在 Julia Discourse 上发帖即可。

    \n
  4. \n
\n

对JuliaDB的具体评论

\n

我在上面指出,要求升级绑定版本的问题StatsBase已经存在于JuliaDB存储库中。您还会发现这个问题已经很老了(此时已经快一年了),如果您检查[Project.toml](https://github.com/JuliaData/JuliaDB.jl/blob/main/Project.toml)主分支上设置兼容边界的文件,您还会看到已经有16 个月前发布了一个 PR 来突破这些界限,但自 2020 年以来没有发布任何新版本。

\n

也就是说,您遇到了一个实际上已经废弃的包 - 请参阅此处的相关问题,该问题建议用户切换到 Dagger.jl 来处理大型分布式表。

\n

如果您现在想“等等,我刚刚读完所有这些只是为了发现我不应该使用JuliaDB”那么我想您是对的,尽管我希望答案的其余部分包含有用的信息这将帮助您解决未来的兼容性问题!

\n