角色

角色提供了一种在用户自定义命令之间组织和重用变量的方法。

默认情况下,Spring CLI 包含一个始终可用的未命名角色。如果未指定特定角色,则命令使用默认角色。

为了进一步自定义和区分角色,您可以将它们与特定的名称关联。这些命名角色存储为位于 ` .spring/commands` 目录旁边的 ` .spring/roles` 目录中的 YAML 文件。

角色允许您定义可在操作文件中使用 Handlebars 访问的变量,从而允许您在命令之间共享数据。

此外,您可以使用角色为命令行选项提供值。如果命令行选项没有指定值,并且存在与命令选项名称相同的角色变量,则命令会自动为此特定选项使用角色变量的值。

文件结构

对于每个角色,都会在 `.spring/roles/vars` 目录中创建一个相应的文件。例如,如果存在 `qa` 和 `prod` 角色,则目录结构如下所示:

$ tree .spring/roles/vars -lr
.spring/roles/vars
├── vars.yml
├── vars-qa.yml
└── vars-prod.yml

`vars.yml` 文件用于默认角色。

此结构遵循与使用特定于配置文件的 Spring 应用程序配置文件类似的模式。但是,角色变量不表现出与 Spring 配置文件相同的行为,例如除了文件(例如环境变量)之外,还可以从其他位置检索值。

快速入门

在这个快速入门中,我们将演示如何向默认角色添加变量并在生成文件时使用它们的值。

让我们首先将角色变量 'greeting' 的值设置为 'Mondo'

$ spring role set --key greeting --value Mondo
Key-value pair added to the default role

键值对存储在根项目目录下的 `./spring/roles/vars/vars.yml` 文件中。

要检索变量的值,请使用以下命令:

$ spring role get --key greeting
Mondo

现在我们创建另一个角色变量:

$ spring role set --key language --value Italian
Key-value pair added to the default role

现在,我们可以将这些变量合并到用户定义的命令中。我们创建一个名为 `hello say` 的用户定义命令:

$ spring command new --command-name hello --sub-command-name say
Created user defined command /home/mark/testing-spring-cli/roles/myapp/.spring/commands/hello/say

在 `.spring/commands/hello/say` 目录中,您可以找到一个名为 `command.yaml` 的文件,其内容如下:

command:
  description: Generate a new file with a hello message
  options:
    #
    - name: greeting
      description: who or what to say hello to
      dataType: string
      defaultValue: World
      inputType: text

请注意,命令行选项名称为 `greeting`,它与我们创建的角色变量名称匹配。

在 `.spring/commands/hello/say` 目录中,有一个名为 `hello.yaml` 的操作文件,其内容如下:

actions:
  - generate:
      to: hello.txt
      text: Hello {{greeting}} on {{os-name}}.

现在我们更新文件以包含:

actions:
  - generate:
      to: hello.txt
      text: Hello {{greeting}} on {{os-name}}. {{#if language}} {{language}} {{/if}}

运行命令而不传递 `greeting` 命令行选项时,`greeting` 的值将从同名角色变量中获取,而不是使用默认值 `World`。

此外,由于我们已定义角色变量 language,我们可以测试其是否存在并将它的值包含在输出中。请注意,language 不是命令行选项。以下命令(及其输出)演示了这一点:

$ spring hello say
Using Role variable instead of default command line option for key = greeting , value = Mondo from the default role
Generated /home/mark/testing-spring-cli/roles/myapp/hello.txt

生成的文本文件包含:

Hello Mondo on Linux.  Italian

`{{greeting}}` 的值来自角色变量,因为它未作为命令行选项提供。

`{{language}}` 变量不是命令行选项,但可以使用 Handlebars 表达式。

现在我们可以删除生成的文本文件。在交互式 shell 中,我们运行 `. ! rm hello.txt` 并传入 `greeting` 命令行选项:

$ spring hello say --greeting amico

生成的文本文件包含:

Hello amico on Linux.  Italian

设置变量

要设置角色变量的值,请使用 `spring role set` 命令:

spring role set --key greeting --value Mondo

您可以选择使用 `--role` 选项指定角色。

获取变量

要检索角色变量的值,请使用以下命令:

spring role get --key greeting

您可以选择使用 `--role` 选项指定角色。

然后可以在使用 Handlebars 模板的操作文件中访问角色变量 greeting。有关示例,请参阅快速入门部分

角色变量还用于与用户定义的命令选项名称进行匹配。如果未明确提供值作为命令行选项,则使用角色变量的值。

您也可以使用特殊命令. !在交互式shell中查看包含角色变量的文件的完整内容。

spring:>. ! cat .spring/roles/vars/vars.yml
greeting: mondo

添加角色

要添加角色,请使用以下命令:

spring role add qa

此命令创建一个名为qa的角色。

在根项目目录下创建一个名为./spring/roles/vars/vars-qa.yml的文件。

列出角色

要列出可用的角色,请使用以下命令:

spring role list

此命令显示角色列表。

┌────┐
│Name│
├────┤
│qa  │
└────┘

移除角色

要移除角色,请使用以下命令:

spring role remove qa

此命令移除名为qa的角色。