假设我们有一个包符号数组 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/