【问题标题】:Change Package directory in Julia在 Julia 中更改包目录
【发布时间】:2016-07-23 18:10:16
【问题描述】:

我想更改 Julia 中的 Package 目录。默认是

"~/.julia/v0.4"

我想将其移动/opt/julia/v0.4/。理想情况下,我想将~/.julia/v0.4 中已安装的软件包移动到新位置。但如果这不可能,我可以重新安装它们。

我该怎么办?

【问题讨论】:

  • 你可以在shell中运行export JULIA_PKGDIR=/opt/julia/v0.4,然后使用Pkg.init()在新目录中初始化一个新的包系统,然后将这些包复制粘贴到新的位置。
  • 我在doc 中查找了JULIA_PKGDIR。我应该只设置JULIA_PKGDIR=/opt/julia,因为版本会自动附加。你应该发布一个答案。
  • @GnimucK。我这样做了,但它破坏了 Jupyter 笔记本。如何提醒 Jupyter 新位置?
  • jupyter kernelspec list 的结果是什么?
  • @GnimucK。没关系。我通过在 Julia 中运行 Pkg.build("IJulia") 来修复它。

标签: julia


【解决方案1】:

Julia-v0.6 及之前的版本

可以按照以下步骤更改 julia 的包目录:

  1. 在shell中运行export JULIA_PKGDIR=/your/directory(或者在windows上手动添加一个新的环境变量JULIA_PKGDIR
  2. 在 julia 中运行 Pkg.init() 以初始化新的包系统
  3. REQUIRE从旧目录复制到新目录
  4. 在朱莉娅中运行Pkg.resolve()

Julia-v0.7+

新包管理器中的“包目录”名为DEPOT_PATH,可以通过添加环境变量JULIA_DEPOT_PATH来更改:

JULIA_DEPOT_PATH=./test julia

julia> DEPOT_PATH
1-element Array{String,1}:
 "./test"

(v0.7) pkg> add JSON2
   Cloning default registries into /Users/gnimuc/test/registries

使用新的包管理器,我们能够在我们想要的任何目录中创建独立的项目,而不是拥有一个巨大的包目录。每个项目都包含一个Project.toml 和一个Manifest.toml(如果它有一些依赖项)。这两个文件记录和跟踪项目的环境。

更新

以下信息可能已过时。我强烈建议使用PkgTemplates.jl 在 Julia-v1.0+ 中生成项目。

生成一个新项目

我们可以在任何文件夹中生成一个新项目,但是我们必须将cd到项目文件夹中using项目。下面的(v0.7)表示我们还处于默认环境,所以不能使用新生成的项目:

(v0.7) pkg> generate ./MyNewProject
Generating project MyNewProject:
    ./MyNewProject/Project.toml
    ./MyNewProject/src/MyNewProject.jl

julia> using MyNewProject
ERROR: ArgumentError: Module MyNewProject not found in current path.
Run `Pkg.add("MyNewProject")` to install the MyNewProject package.
Stacktrace:
 [1] require(::Module, ::Symbol) at ./loading.jl:868

如果我们cd到项目文件夹和activate环境,​​那么我们可以using我们的新项目没有任何问题:

shell> cd MyNewProject/
/Users/gnimuc/MyNewProject

(v0.7) pkg> activate .

(MyNewProject) pkg> 

julia> using MyNewProject

我认为这是新包管理器和旧包管理器之间的最大区别。简而言之,我们需要明确地activate我们未注册的项目/包。

下载并初始化别人的项目

根据文档,我们可以通过add命令添加一个未注册的包/项目:

(HelloWorld) pkg> add https://github.com/fredrikekre/ImportMacros.jl

此命令将目标包添加为我们当前项目的依赖项。在本例中,我们在HelloWorldManifest.toml 中添加了ImportMacros。如果我们只是将它用作顶级项目呢?要将其添加到默认环境(v0.7)?不,我们不需要。答案是我们可以直接下载代码cd到文件夹中,然后在pkg模式下运行instantiate

shell> git clone https://github.com/Gnimuc/GLTF.jl GLTF
Cloning into 'GLTF'...
remote: Counting objects: 286, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 286 (delta 73), reused 103 (delta 59), pack-reused 167
Receiving objects: 100% (286/286), 62.16 KiB | 46.00 KiB/s, done.
Resolving deltas: 100% (135/135), done.

shell> cd GLTF

pkg> activate .

(GLTF) pkg> instantiate
  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`

新的包管理器很棒!我们既不需要在using 之前使用“include”,也不需要为using 它打包所有内容。我们现在有了功能齐全的“项目”!

【讨论】:

  • 如果你有 IJulia,之后运行Pkg.build("IJulia")
  • 你的更新让我对我想做的事有了希望。我在 Windows 上,每当我在pkg 模式下执行Pkg.addadd 时,所有这些包都会转到我不想要的~/.julia。我以为我可以使用您的方法将包隔离到我的项目中,但显然不行。
  • @Vivere 您能否详细说明一下您的用例?所有依赖项都缓存在JULIA_DEPOT_PATH 中,并且这些包相互隔离。在开发自己的包时,您可以activate 到一个隔离的环境,而不会出现任何版本冲突问题。对我来说,您的目标似乎是发布包并打包其所有依赖项。 PackageCompiler.jl 是正确的工具。
【解决方案2】:

朱莉娅唯一的方式:

julia> ENV["JULIA_PKGDIR"] = "E:\\Julia-0.6.0\\portable"
"E:\\Julia-0.6.0\\portable"

julia> ENV["JULIA_PKGDIR"]
"E:\\Julia-0.6.0\\portable"

julia> Pkg.init()
INFO: Initializing package repository E:\Julia-0.6.0\portable\v0.6
INFO: Cloning METADATA from https://github.com/JuliaLang/METADATA.jl

但是,缓存目录仍然指向旧文件夹,所以我检查了原因并弄清楚了:

julia> Base.LOAD_CACHE_PATH
1-element Array{String,1}:
 "C:\\Users\\kung\\.julia\\lib\\v0.6"

julia> Pkg.__init__()
2-element Array{String,1}:
 "E:\\Julia-0.6.0\\portable\\lib\\v0.6"
 "C:\\Users\\kung\\.julia\\lib\\v0.6"

julia> pop!(Base.LOAD_CACHE_PATH)
"C:\\Users\\kung\\.julia\\lib\\v0.6"

julia> Base.LOAD_CACHE_PATH
1-element Array{String,1}:
 "E:\\Julia-0.6.0\\portable\\lib\\v0.6"

作为简单函数:

function set_julia_dir(dir::String)
    ENV["JULIA_PKGDIR"] = dir
    Pkg.init()
    Pkg.__init__()
    pop!(Base.LOAD_CACHE_PATH)
end

set_julia_dir("E:\\Julia-0.6.0\\portable")

【讨论】:

  • 如果我重启 Julia 会保留这个设置吗?
  • 环境变量只是临时的,所以每次都需要调用set_julia_dir
  • 如果你不想在你的shell启动脚本中设置JULIA_PKGDIR,唯一的办法就是编辑Base,默认情况下在base/pkg/dir.jl中硬编码为joinpath(homedir(),".julia"),然后重建系统镜像朱莉娅
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 2016-03-30
  • 2013-06-07
相关资源
最近更新 更多