模块的应用
将文件转储到目录
传统 shell 中的一个常见模式是将文件转储到目录并自动加载(例如,加载自定义补全)。在 Nushell 中,直接这样做目前还不可能,但仍然可以使用目录模块。
这里我们将创建一个简单的补全模块,其中包含一个专门用于某些 Git 补全的子模块:
创建补全目录
mkdir ($nu.default-config-dir | path join completions)为其创建一个空的
mod.nutouch ($nu.default-config-dir | path join completions mod.nu)将以下代码片段放入
completions目录下的git.nu文件中export extern main [ --version(-v) -C: string # ... 等等 ] export extern add [ --verbose(-v) --dry-run(-n) # ... 等等 ] export extern checkout [ branch: string@complete-git-branch ] def complete-git-branch [] { # ... 列出 git 分支的代码 }将
export module git.nu添加到mod.nu在
env.nu中将completions目录的父目录添加到你的NU_LIB_DIRS中$env.NU_LIB_DIRS = [ ... $nu.default-config-dir ]在
config.nu中导入补全到 Nushell:use completions *
现在你已经设置了一个可以放置补全文件的目录,下次启动 Nushell 时应该会有一些 Git 补全。
注意
这将使用文件名(在我们的示例中为 git.nu 中的 git)作为模块名称。这意味着如果定义中包含基本命令名称,某些补全可能无法工作。 例如,如果你在 git.nu 中将我们的已知外部命令定义为 export extern 'git push' [] 等,并遵循其余步骤,你将得到像 git git push 等子命令。 你需要调用 use completions git * 来获得所需的子命令。因此,使用上面步骤中概述的 main 是定义子命令的首选方式。
覆层和"虚拟环境"
覆层是 层 的 定义 。我们可以利用它来建立一个临时的虚拟环境,其中包含自定义环境变量,最后再丢弃这些变量。
我们在这个示例中的目标是:
- 从名为
env.json的文件激活一组环境变量 - 在此上下文中工作
- 丢弃环境 - 恢复原始环境
首先,让我们准备一个 env.json 用于测试:
{ A: 1 B: 2 } | save env.json
$env.A = 'zzz'
print $"('A' in $env) ('B' in $env)"
# => true false现在让我们创建一个带有 load 命令的 env 模块,该命令从 env.json 加载环境,并将其用作覆层:
'export def --env load [] { open env.json | load-env }' | save env.nu
overlay use ./env.nu
overlay list
# => ╭───┬──────╮
# => │ 0 │ zero │
# => │ 1 │ env │
# => ╰───┴──────╯现在我们加载 env.json 文件:
load
print $"($env.A) ($env.B)"
# => 1 2要隐藏覆层:
overlay hide env
print $"('A' in $env) ('B' in $env)"
# => true false请注意 - 如覆层中所述 - 重新激活覆层将恢复加载的环境变量, 只要 Nushell 会话保持活动状态,就不会创建新的上下文,尽管 overlay list 不再列出覆层。
更多相关信息,特别是关于环境变量及其修改的信息,可以在环境、模块、覆层中找到, 以及相应的命令文档:def --env、export def --env、load-env 和 export-env。
复杂的虚拟环境
这种覆盖环境的方法可用于限定更复杂的虚拟环境,包括更改 PATH 环境变量,或在环境变量或文件中定义的其他工具设置。
像 conda 或 Python virtualenv 这样的工具管理和隔离环境变量集。 官方 virtualenv 集成利用了这些概念。 我们的 nu_scripts 仓库有一个非官方的 Conda 模块。