家庭项目和--project
--project 标志定义了“家庭项目”或“家庭环境”。环境由Project.toml/Manifest.toml 定义,并定义可用于using/import 的包。
您可以将--project 设置为 (i) 目录(有或没有Project.toml)(ii) 到Project.toml 的路径或(iii) 到@.。 (i) 和 (ii) 是不言自明的——Julia 会将位于路径上的项目视为主项目。现在对于 (iii),如果您设置 --project=@.,Julia 将尝试查找 现有 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 操作包时)。
现在,将其与@. 的行为进行比较,后者将查找现有项目文件:
# 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 文件。使用@. 选项,Julia 首先在当前目录中查找Project.toml 文件,如果未找到,则上一级到父文件夹并查找,依此类推。这就是第二个示例中发生的情况; Julia 在空的A 目录中没有找到Project.toml 文件,所以我们向上移动到父目录,找到了我们那里的Project.toml。
是的,我们可以为此选择其他标记,但不是.,因为它已经有意义;它是当前目录的路径,也是与--project 一起使用的完全有效的路径。
加载路径和"@"
要加载一个包Example,我们在其[deps] 部分定义一个带有Example 的家庭项目是不够的;主项目还需要显示在 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[]