更改Julia中的Package目录

时间:2016-04-04 09:13:14

标签: julia

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

"~/.julia/v0.4"

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

我该怎么做?

2 个答案:

答案 0 :(得分:33)

Julia-v0.6和之前

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

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

    此命令将目标包添加为当前项目的依赖项。在此示例中,我们在ImportMacros' s HelloWorld中添加了Manifest.toml。如果我们只将它用作顶级项目怎么办?要将其添加到默认环境(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`
    

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

    ## uncomment the following lines to override the default test script
    script:
     - julia -e 'using Pkg; Pkg.instantiate(); Pkg.build("GLTF"); Pkg.test("GLTF"; coverage=true)'
    

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

    (GLTF) pkg> add https://github.com/Gnimuc/GLTF.jl
    

    更新git-repo https://github.com/Gnimuc/GLTF.jl 错误:无法添加与项目具有相同名称或uuid的包

    新的包管理器很棒!我们在include"之前都不需要" using也不仅仅为using将所有内容都打包成一个包。我们拥有功能齐全的项目"现在!

答案 1 :(得分:3)

朱莉娅唯一的方式:

Just (TagResultList {tags = [TagResult {name = "tag1", numberOfDevicesTagged = 1},TagResult {name = "tag2", numberOfDevicesTagged = 7}]})

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

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"