如何在本地注册表中注册一个本地的Julia包?

22

我在我的主目录下有一个名为 Foo 的 Julia 包。Foo 是一个目录,其中包含描述软件包依赖项、名称等的Project.toml文件。 我想以特定方式从另一个文件夹中使用此软件包,如下所示。

  1. 构建软件包Foo
  2. 在Julia本地存储库中注册Foo
  3. 从系统的任何位置(例如脚本script.jl)运行Pkg.add("Foo"),该脚本应包含以下内容:
using Pkg
Pkg.add("Foo")
using Foo

# Now use Foo
Foo.bar()

这是我目前尝试的方法。

  • 导航到Baz目录,我希望在其中运行Baz/script.jl
  • 使用repl,按下]并运行dev --local PATH_TO_FOO
  • repl运行using Foo
  • Foo现在可以在当前的repl会话(或脚本)中访问
  • 总结: 我已经成功导入了另一个目录Baz中的Foo包。

基本上,我想编写一个script.jl,可以利用本地注册表而不是这个dev --local .方法。


1
这是一个很好的问题。我也有同样的疑问。期待答案的到来。 - logankilpatrick
答案相当复杂。您需要创建一个注册表(作为本地git存储库,使用特殊结构?),然后将其添加到本地注册表列表中(在1.1+上更容易),然后将您的软件包添加到其中(实际上非常复杂,但Pkg问题中有一个脚本可用)。我认为我没有时间适当地回答这个问题。 - Frames Catherine White
位:创建私有注册表 https://discourse.julialang.org/t/creating-a-registry/12094/6。添加到私有注册表 https://github.com/JuliaRegistries/Registrator.jl/issues/197。添加注册表 https://julialang.github.io/Pkg.jl/v1/registries/。 - Frames Catherine White
如果有人想要将上述两个评论粘在一起,并从链接中提取关键内容,那将会是一个很好的答案。 - Frames Catherine White
2个回答

12

我假设这是为个人使用而不是大型团体的系统管理员。

维护注册表是一项艰巨的工作。如果可能的话,我会避免创建注册表。如果您的目标是使脚本的使用变得更加轻松,那么有一个更轻便的解决方案:共享环境。

共享环境 是一个普通的环境,在一个规范化的位置创建。这意味着 Pkg 将能够通过名称找到它:您无需指定显式路径。

要设置共享环境:

  • 给它一个名称:Pkg.activate("ScriptEnvironment"; shared=true)
  • 填充它:Pkg.add(Pkg.PackageSpec(; path="/path/to/Foo"))(根据您的用例,您也可以使用Pkg.develop、添加已注册的软件包等)
  • 就这些了!

现在,所有脚本都可以使用共享环境:

using Pkg
Pkg.activate("ScriptEnvironment"; shared=true)
using Foo

如果其他脚本集需要不同的程序包集,请使用不同的共享名称重复该过程。Pkg环境非常便宜,因此可以自由地大量使用此方法。


注意:我不建议以Pkg.add("Foo")开始脚本,因为这会有意无意地污染活动环境。


1
更轻便的方法是将其安装到全局环境(v1.2等)。 - Frames Catherine White
1
共享是做什么用的? - Frames Catherine White
1
shared 在一个规范的位置创建环境。请尝试使用Pkg.activate("v1.2"; shared=true) - David Sainez
2
哦,好的。将其添加到答案中? - Frames Catherine White
1
@DavidVarela 我的目标是建立一个本地工具库,这些工具不能公开(专有知识产权),我想要一种简单的方法在本地环境中使用Julia的软件包管理器。 - Neil
这种方法不需要在所有部署软件包的机器之间共享文件系统吗? - Alex338207

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接