Домашний проект и --project
Флаг --project
определяет «домашний проект» или «домашнюю среду».Среда определяется как Project.toml
/ Manifest.toml
и определяет, какой пакет доступен для using
/ import
.
. Вы можете установить --project
в (i) каталог (с или безa Project.toml
) (ii) путь к Project.toml
или (iii) к @.
.(i) и (ii) довольно понятны - Юлия будет рассматривать проект, расположенный на пути, как домашний проект.Теперь для (iii), если вы установите --project=@.
Джулия попытается найти существующий Project.toml
файл и использовать его в качестве домашнего проекта.Рассмотрим следующий пример:
~$ tree .
.
├── A
└── Project.toml
1 directory, 1 file
где A
- пустой каталог.Мы можем легко попробовать (i) и (ii):
# existing file
[~]$ julia --project=Project.toml -E 'Base.active_project()'
"~/Project.toml"
# existing directory
[~]$ julia --project=A -E 'Base.active_project()'
"~/A/Project.toml"
# non-existing directory
[~]$ julia --project=B -E 'Base.active_project()'
"~/B/Project.toml"
# non-existing file
[~]$ julia --project=B/Project.toml -E 'Base.active_project()'
"~/B/Project.toml"
Обратите внимание, что в трех последних примерах выше Project.toml
файл не существует , но он будет создан, еслинеобходимо (например, при использовании Pkg
для манипулирования пакетами).
Теперь сравните это с поведением @.
, которое будет искать существующий проектfile:
# from our root directory
[~]$ julia --project=@. -E 'Base.active_project()'
"~/Project.toml"
# from inside the A directory
[~/A]$ julia --project=@. -E 'Base.active_project()'
"~/Project.toml"
, где в обоих случаях мы нашли один и тот же Project.toml
файл.С опцией @.
Джулия сначала ищет в текущем каталоге файл Project.toml
, а если не найден, поднимается на один уровень вверх к родительской папке и просматривает там, и так далее.Это то, что произошло во втором примере;Джулия не нашла файл Project.toml
в пустом каталоге A
, поэтому мы переместились в родительский каталог и нашли там Project.toml
.
И да, мы могли бы выбрать несколькодругой знак для этого, но не .
, поскольку это уже имеет значение;это путь к текущему каталогу и совершенно правильный путь для использования с --project
.
Путь загрузки и "@"
Для загрузки пакета Example
это недостаточно, чтобы мы определили домашний проект с Example
в его разделе [deps]
;домашний проект также должен отображаться в пути загрузки Julias (Base.load_path()
).По умолчанию путь загрузки увеличивается с ["@", "@v#.#", "@stdlib"]
, где "@v#.#"
расширяется до ~/.julia/environments/v#.#
, при этом #
заменяется номером основной и вспомогательной версии Julias, а "@stdlib"
расширяется до каталога со стандартной библиотекой Julias."@"
расширяется до 1. активного проекта (активируется с помощью Pkg.activate
/ pkg> activate
) или 2. домашнего проекта.Мы можем проверить расширенный путь загрузки с помощью Base.load_path()
:
# without home project; @ expands to nothing
[~]$ julia -E 'Base.load_path()'
["~/.julia/environments/v1.0/Project.toml", "~/julia10/usr/share/julia/stdlib/v1.0"]
# with home project; @ expands to our specified home project
[~]$ julia --project=@. -E 'Base.load_path()'
["~/Project.toml", "~/.julia/environments/v1.0/Project.toml", "~/julia10/usr/share/julia/stdlib/v1.0"]
И, наконец, если мы удалим "@"
из пути загрузки, это не имеет значения, что мы определили домашний проект:
[~]$ export JULIA_LOAD_PATH="" && julia --project=@. -E 'Base.load_path()'
String[]