如何使Julia PkgServer.jl脱机工作

如何使Julia PkgServer.jl脱机工作,julia,Julia,我主要在离线机器上工作,并且非常想开始从Python迁移到Julia。目前我面临的最大问题是如何在我自己的网络上设置无法访问internet的包服务器。我可以将文件复制到脱机计算机/网络,并希望能够缓存Julia软件包生态系统的大部分,然后将其复制到我的网络,以便我和其他人可以根据需要安装软件包 我尝试过使用部署docker compose脚本,然后安装一长串包,这样PkgServer实例就可以缓存所有内容。接下来使PkgServer计算机脱机并尝试从中安装软件包。这很好,但是当我重新启动服务器

我主要在离线机器上工作,并且非常想开始从Python迁移到Julia。目前我面临的最大问题是如何在我自己的网络上设置无法访问internet的包服务器。我可以将文件复制到脱机计算机/网络,并希望能够缓存Julia软件包生态系统的大部分,然后将其复制到我的网络,以便我和其他人可以根据需要安装软件包

我尝试过使用部署docker compose脚本,然后安装一长串包,这样PkgServer实例就可以缓存所有内容。接下来使PkgServer计算机脱机并尝试从中安装软件包。这很好,但是当我重新启动服务器运行的docker容器时,一切都很快崩溃了

似乎PKG服务器在能够为包提供服务之前,至少需要能够与存储服务器交谈一次。我试着设置:
JULIA_PKG_SERVER_STORAGE_SERVER
from:
“https://us-east.storage.juliahub.com,https://kr.storage.juliahub.com“
到:
,但失败得很惨

谁能给我指一下正确的方向吗

短暂性脑缺血发作

看起来PKG服务器实际上正在尝试在启动之前联系注册表。我对注册表的内容了解不够,不知道是否有办法破解它,在本地查看或忽略它

这可能会有帮助,但我还不确定如何开始

这里有一个解决方案,基于

初步步骤

安装所有必需的软件包。您可以将它们放在默认环境(例如
@v1.5
)或专用项目中

为了使用
LocalPackageServer
,我们需要设置一个本地注册表,即使我们不会真正使用它(但如果您还必须提供本地包,它仍然很方便)

类似的操作应该在当前文件夹中创建一个空的本地注册表,名为
local registry.gitt

# Create an empty (bare) git repository to host the registry
run(`git init --bare local-registry.git`)

# Populate the repository with a new, empty local registry
using LocalRegistry
Base.Filesystem.mktempdir() do dir
    create_registry(joinpath(dir, "local-registry"),
                    abspath("local-registry.git"),
                    description = "(unused) local registry",
                    push=true)
end
步骤1a-运行本地包服务器(联机)

下面这样的脚本应该运行一个本地包服务器来监听
http://localhost:8000

#################
# run_server.jl #
#################

using LocalPackageServer

config = LocalPackageServer.Config(Dict(
    # Server parameters
    "host"           => "127.0.0.1",
    "port"           => 8000,
    "pkg_server"     => "https://pkg.julialang.org",

    # This is where persistent data will be stored
    # (I use the current directory here; adjust to your constraints)
    "local_registry" => abspath("local-registry.git"), # In accordance with the preliminary step above
    "cache_dir"      => abspath("cache"),
    "git_clones_dir" => abspath("data"),
))

# The tricky part: arrange for the server to never update its registries
# when it is offline
if get(ENV, "LOCAL_PKG_SERVER_OFFLINE", "0") == "1"
    @info "Running offline => no registry updates"
    config.min_time_between_registry_updates = typemax(Int)
end

# Start the server
LocalPackageServer.start(config)
首先使用此脚本联机运行服务器:

shell$julia--project run_server.jl
步骤1b-缓存一些包(在线)

配置Julia进程以使用本地服务器,并安装要缓存的包:

#注意指定“http://”协议
#(否则,客户端可能会使用https,而服务器不会应答)
shell$JULIA_PKG_服务器=http://localhost:8000 朱莉娅
julia>使用Pkg
julia>pkg“添加示例”
[...]
此时,服务器应该正在缓存内容

步骤2-运行包服务器(脱机)

脱机时,只需重新启动服务器,确保它不会尝试更新注册表:

shell$LOCAL\u PKG\u SERVER\u OFFLINE=1 julia--project run\u SERVER.jl
如前所述,根据需要设置
JULIA_PKG_服务器
,以便JULIA客户端使用本地服务器;如果项目环境解析为缓存的完全相同的依赖项版本,他们现在应该能够安装软件包


(您可能希望联机解析和实例化项目环境,然后将相关清单传输到脱机系统:这可能有助于确保包服务器缓存与客户端要求的内容之间的一致性。)

您是否尝试过采用相同的方法,但改为使用?我自己还没有尝试过,但是,由于
LocalPackageServer
将包服务器和存储服务器捆绑在一起,所以它不需要到达任何远程存储服务器(除非要求提供尚未在本地缓存的服务),我试过了,但很确定我做错了什么。。我能够创建一个运行的容器,它正在缓存包,但我无法让PkgServer指向它。他们都在同一个覆盖网络上,但我想可能我只是没有为它设置正确的端口。实际上,看起来我还没有尝试那个。我试过了。我认为我遇到的问题不是端口问题,但可能只是为
localhost
配置的,我不确定如何配置它。
#################
# run_server.jl #
#################

using LocalPackageServer

config = LocalPackageServer.Config(Dict(
    # Server parameters
    "host"           => "127.0.0.1",
    "port"           => 8000,
    "pkg_server"     => "https://pkg.julialang.org",

    # This is where persistent data will be stored
    # (I use the current directory here; adjust to your constraints)
    "local_registry" => abspath("local-registry.git"), # In accordance with the preliminary step above
    "cache_dir"      => abspath("cache"),
    "git_clones_dir" => abspath("data"),
))

# The tricky part: arrange for the server to never update its registries
# when it is offline
if get(ENV, "LOCAL_PKG_SERVER_OFFLINE", "0") == "1"
    @info "Running offline => no registry updates"
    config.min_time_between_registry_updates = typemax(Int)
end

# Start the server
LocalPackageServer.start(config)