更改Julia中的Package目录

bec*_*cko 17 julia

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

"~/.julia/v0.4"
Run Code Online (Sandbox Code Playgroud)

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

我需要做什么?

Gni*_*muc 38

Julia-v0.6和之前

可以通过以下步骤更改julia的包目录:

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

朱莉娅 - 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
Run Code Online (Sandbox Code Playgroud)

使用新的包管理器,我们可以在我们想要的任何目录中创建独立的项目,而不是拥有一个巨大的包目录.每个项目都包含一个Project.toml和一个Manifest.tomlif它是否有一些依赖项.这两个文件记录并持续跟踪项目的环境.

UPDATE

以下信息可能是旧的.我建议使用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
Run Code Online (Sandbox Code Playgroud)

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

shell> cd MyNewProject/
/Users/gnimuc/MyNewProject

(v0.7) pkg> activate .

(MyNewProject) pkg> 

julia> using MyNewProject
Run Code Online (Sandbox Code Playgroud)

我认为这是新包装经理与旧包装经理之间的巨大差异.简而言之,我们需要明确activate我们未注册的项目/包.

下载并初始化其他人的项目

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

(HelloWorld) pkg> add https://github.com/fredrikekre/ImportMacros.jl
Run Code Online (Sandbox Code Playgroud)

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

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`
Run Code Online (Sandbox Code Playgroud)

当我们在CI中进行自动测试时,这尤其有用,例如,TravisCI上的测试脚本应该是(更新:在Appveyor上使用此脚本):

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
Run Code Online (Sandbox Code Playgroud)

在这里,我们直接运行include而不是using.这是因为我们已经在项目文件夹/环境中,将自己添加为依赖项是疯狂的.如果你这样做,包管理器会抱怨这样的事情:

(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
Run Code Online (Sandbox Code Playgroud)

更新git-repo using 错误:无法添加与项目具有相同名称或uuid的包

新包经理很棒!我们既不需要" export JULIA_PKGDIR=/your/directory之前JULIA_PKGDIR"也不需要将所有东西都作为一个包装Pkg.init().我们现在有功能齐全的"项目"!

  • 如果你有IJulia,请运行`Pkg.build("IJulia")`. (2认同)

lam*_*345 5

朱莉娅唯一的方法:

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
Run Code Online (Sandbox Code Playgroud)

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

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"
Run Code Online (Sandbox Code Playgroud)

作为简单的功能:

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")
Run Code Online (Sandbox Code Playgroud)

  • 如果你不想在你的 shell 启动脚本中设置 JULIA_PKGDIR,唯一的方法是编辑 Base,默认情况下它被硬编码为 `base/pkg/dir.jl 中的 `joinpath(homedir(),".julia")` ` 然后重建Julia的系统镜像 (2认同)