gpt4 book ai didi

command-line-interface - Julia `@.` 命令行选项中的 `--project` 是什么?

转载 作者:行者123 更新时间:2023-12-03 15:30:53 25 4
gpt4 key购买 nike

在命令行中启动 Julia 时,可以指定项目目录。选项之一是 @. ,大概是当前目录。什么是@.在这种情况下?

# from `julia --help`
--project[={<dir>|@.}] Set <dir> as the home project/environment

来自 docs :

If the variable is set to @., Julia tries to find a project directory that contains Project.toml or JuliaProject.toml file from the current directory and its parents.



我意识到 cli --project参数解析发生在 C code , 并且显然被这个 init code 使用,尽管我不确定两者之间的事件顺序。

具体在 initdefs.jl我们有:
project = (JLOptions().project != C_NULL ?
unsafe_string(Base.JLOptions().project) :
get(ENV, "JULIA_PROJECT", nothing))
HOME_PROJECT[] =
project == nothing ? nothing :
project == "" ? nothing :
project == "@." ? current_project() : abspath(project)

我对这段代码的阅读是 @.只是一个任意标记,它可能是一个简单的 .为cli? Julia 如何搜索“当前目录及其父目录”。
LOAD_PATH 中使用了类似的符号。 ( ["@", "@v#.#", "@stdlib"]),
正如所讨论的 herehere .是否 @.LOAD_PATH 属于同一扩展系列符号?

最佳答案

家项目和--project--project flag 定义“家庭项目”或“家庭环境”。环境由 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 没有找到 Project.toml空文件 A目录,所以我们向上移动到父目录,找到 Project.toml我们在那里。

是的,我们可以为此选择其他 token ,但不是 .因为那已经有意义了;它是当前目录的路径,并且是与 --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[]

关于command-line-interface - Julia `@.` 命令行选项中的 `--project` 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53613663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com