Изменить каталог пакетов в Julia

Я хочу изменить каталог Package в Julia. По умолчанию используется

"~/.julia/v0.4"

Я хочу переместить его на /opt/julia/v0.4/. В идеале я хочу переместить пакеты, которые уже установлены в ~/.julia/v0.4, в новое место. Но если это невозможно, я могу их переустановить.

Что мне делать?

Ответ 1

Julia-v0.6 и раньше

можно изменить каталог пакетов julia, выполнив следующие действия:

  1. запустить export JULIA_PKGDIR=/your/directory в оболочке (или вручную добавить новую переменную среды JULIA_PKGDIR в windows)
  2. запустите Pkg.init() в julia, чтобы инициализировать новую систему пакетов
  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, если он имеет некоторые зависимости. Эти два файла записывают и отслеживают среду проекта.

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

Если мы 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 в HelloWorld Manifest.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'

Новый менеджер пакетов великолепен! Нам не нужно ни "include до using", ни делать все как пакет только для using. У нас есть полнофункциональный "Проект" сейчас!

Ответ 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")