Изменить каталог пакетов в Julia
Я хочу изменить каталог пакетов в Julia. Значение по умолчанию:
"~/.julia/v0.4"
Я хочу движение на /opt/julia/v0.4/
. В идеале я хочу переместить пакеты, которые уже установлены в ~/.julia/v0.4
на новое место. Но если это невозможно, я могу переустановить их.
что я должен сделать?
2 ответов
Julia-v0.6 и раньше
можно изменить каталог пакетов Джулии, выполнив следующие действия:
- выполнить
export JULIA_PKGDIR=/your/directory
в консоли(или вручную добавить новую переменную средыJULIA_PKGDIR
на windows) - выполнить
Pkg.init()
в julia для инициализации новой системы пакетов - скопировать
REQUIRE
из старого каталога в новый - выполнить
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
если он имеет некоторые зависимости. Эти два файла записывают и отслеживают окружающую среду проекта.
создать новый проект
мы можем создать новый проект в любой папке, но мы должны cd
в папку проекта using
проект. The (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
наш незарегистрированный проект / пакет.
скачать и init чужой проект
согласно документу, мы можем добавить незарегистрированный пакет / проект через :
(HelloWorld) pkg> add https://github.com/fredrikekre/ImportMacros.jl
эта команда добавляет целевой пакет как зависимость от нашего текущего проекта. В этом примере мы добавили ImportMacros
на HelloWorld
' s 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`
это особенно полезно, когда мы делаем автоматическое тестирование в CI, например, тестовый скрипт на TravisCI должен быть(UPDATE: use этот скрипт на Appveyor):
## 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
его. Теперь у нас полнофункциональный "проект"!
Юлька только так:
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
тем не менее, Cache dir все еще указывает на старую папку, поэтому я проверил, почему это так и понял:
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")