julia - 如何创建一个 sys 镜像,该镜像具有多个包,其预编译函数缓存在 julia 中?

标签 julia

假设我们有一个包符号数组 packages::Vector{Symbol} = [...]我们想使用 PackageCompiler.jl 创建一个 sys 镜像.我们可以简单地使用

using PackageCompiler

create_sysimage(packages; incremental = false, sysimage_path = "custom_sys.dll"

但是如果没有 precompile_execution_file,这将是不值得的。

注意:Linux 上的 sysimage_path = "custom_sys.so"和 macOS 上的 "custom_sys.dylib"...

对于 precompile_execution_file,我认为为每个包运行测试可能会这样做,所以我做了这样的事情:

预编译.jl
packages = [...]

@assert typeof(packages) == Vector{Symbol}

import Pkg

m = Module()
try Pkg.test.(Base.require.(m, packages)) catch ; end

try catch 用于当某些测试出现错误并且我们不希望它失败时。

然后,在 shell 中执行以下命令,
using PackageCompiler

packages = [...]

Pkg.add.(String.(packages))
Pkg.update()
Pkg.build.(String.(packages))

create_sysimage(packages; incremental = false,
                          sysimage_path = "custom_sys.dll",
                          precompile_execution_file = "precompilation.jl")


生成了一个加载没有问题的 sys 图像动态库。当我做 using Makie ,没有延迟,所以这部分很好,但是当我和 Makie 一起做一些绘图时,仍然有第一次绘图延迟,所以我猜预编译脚本没有做我认为它会做的事情。

此外,当使用 tab 在 repl 中获取建议时,它会第一次卡住,但我猜这是预期的副作用。

最佳答案

您的 precompilation.jl 存在一些问题脚本,使测试抛出您看不到的错误,因为 try...catch .

但是,虽然为每个包运行测试可能是一个好主意,但我认为它不能如此简单地工作还有更深层次的原因:

  • Pkg.test产生一个新的进程,在其中实际运行测试。我不认为 PackageCompiler可以看到在这个单独的过程中发生了什么。
  • 为了避免这种情况,您可能只想简单地 include()每个包裹的test/runtests.jl文件。但这也可能会失败,因为缺少 test-specific dependencies .

  • 所以我想说的是,为了让所有包可靠且系统地工作,您必须重新实现(或重新使用,如果可以的话)Pkg.test 的一些内部逻辑。为了将所有特定于测试的依赖项添加到当前环境。

    话虽如此,一些包具有现成的预编译脚本,有助于做到这一点。 Makie 就是这种情况,它在其文档中建议使用以下文件来构建系统镜像:
    joinpath(pkgdir(Makie), "test", "test_for_precompile.jl")
    

    关于julia - 如何创建一个 sys 镜像,该镜像具有多个包,其预编译函数缓存在 julia 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61176508/

    相关文章:

    dataframe - 了解 Julia DataFrames.select() 中冒号的行为

    arrays - 显式定义变量与访问数组

    julia - 如何显示函数的定义

    dataframe - 使用 findall() 函数在多个条件下搜索数据框中的索引

    css - Julia 笔记本自定义 css

    julia - 在两个文件中重载一个函数(在 Julia 中)

    julia - 一个包中有 2 个模块是不是很糟糕?

    Julia 相当于 python 中的 "not"

    julia - 如何在 Julia 约会

    向量的向量访问 undefined reference