角色
角色提供了一种跨用户自定义命令组织和重用变量的方式。
默认情况下,Spring CLI 包含一个始终可用的未命名角色。如果未指定特定角色,命令将使用默认角色。
为了进一步自定义和区分角色,您可以为它们关联特定名称。这些命名角色以 YAML 文件形式存储在 .spring/roles
目录中,该目录与 .spring/commands
目录位于同一位置。
角色允许您使用 Handlebars 在 Action 文件中访问定义的变量,从而在命令之间共享数据。
此外,您可以使用角色为命令行选项提供值。如果某个命令行选项未指定值,并且存在与该命令选项同名的角色变量,则命令会自动使用该角色变量的值作为该特定选项的值。
文件结构
对于每个角色,会在 .spring/roles/vars
目录中创建一个相应的文件。例如,如果存在 qa
和 prod
角色,则目录结构如下所示:
$ tree .spring/roles/vars -lr
.spring/roles/vars
├── vars.yml
├── vars-qa.yml
└── vars-prod.yml
vars.yml
文件用于默认角色。
此结构类似于使用特定 profile 的 Spring 应用程序配置文件的方式。然而,角色变量不具有与 Spring profiles 相同的行为,例如除了文件之外还从其他位置(如环境变量)检索值。
快速入门
在本快速入门中,我们将演示如何向默认角色添加变量,并在生成文件时使用它们的值。
让我们首先将角色变量 '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
的 Action 文件,其内容如下:
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 模板的 Action 文件内部访问角色变量 greeting。请参阅快速入门部分以获取示例。
角色变量也用于匹配用户自定义的命令选项名称。如果未明确将值作为命令行选项提供,则使用角色变量的值。
您还可以使用特殊命令 . !
,在交互式 shell 中查看包含角色变量的文件的完整内容:
spring:>. ! cat .spring/roles/vars/vars.yml
greeting: mondo