18 个版本

0.3.6 2021 年 1 月 25 日
0.3.5 2020 年 11 月 2 日
0.3.4 2020 年 8 月 15 日
0.3.0 2020 年 7 月 29 日
0.1.9 2020 年 7 月 20 日

#241构建实用工具

Download history 34/week @ 2024-03-30

52 每月下载量

MIT/Apache

220KB
5.5K SLoC

sht / short / 🩳

Crate status linux osx azure releases dicord

一个简洁的 CLI 启动器/项目管理者,使用 env 文件。

其主要目标是可读性和通过使用项目中的命令节省时间。Short 是一个命令行工具,允许通过从 .env 文件映射环境变量来运行程序(通常是 sh 脚本)。它类似于运行 eval $(.env_file) ./script.sh 并具有更多选项。

short global workflow

安装

此产品处于 alpha 版,但个人使用时相对稳定。

ArchLinux AUR:short-git

git clone https://aur.archlinux.org/short-git.git
cd short-git
makepkg -si

Homebrew(OSX、Linux)

brew install vincent-herlemont/tap/short

从源代码

编译需求:libgit2openssl

cargo install short

配置提示

强烈建议配置提示。这可以让你每次都知道选择了哪个 设置
环境。您可以查看 show 命令以获取更多详细信息。

✨ PS1 (BASH/ZSH)

使用 .bashrc 配置 PS1 的示例

export PS1="$(sht show -f):\w\$ "

使用 .zshrc 配置 PS1 的示例

⚠️ TODO ...
✨ starship

使用 自定义提示前命令: starship 的示例。

这里是在显示提示前 starship 运行的自定义脚本。

#!/bin/bash

function blastoff(){
    sht show -f
}
starship_precmd_user_func=blastoff

预览

$> [my_setup:my_env] ~/your_project$

快速开始空白 ✍️

生成一个简单的 sh 脚本来显示变量。您可以使用这个基础来做什么,详见 generate

sht generate <setup_name> <environment_name> <file_kind:sh|bash>
$> sht init
$> sht generate setup_1 test sh -d
$> sht run

-d:创建一个子目录(可选)。

使用模板快速开始 🚀

🌱 使用 Node && ExpressJs 的示例

根据此模板 node-express 生成一个简单的 aws sam 项目。详见 generate

要求:您已安装 nodenpm

$> sht init
$> sht generate node-express -d -t
$> sht run

-t:从模板生成。 -d:创建子目录 (可选)

🌱 使用 AWS SAM 的示例

根据此模板 aws-node-sam 生成一个简单的 aws sam 项目。详见 generate

要求:您已安装 SAMAWS_CLI

$> sht init
$> sht generate aws-node-sam -d -t
$> sht run

-t:从模板生成。 -d:创建子目录 (可选)

--l:列出所有模板,并添加一个新模板 here


命令

init 项目。

创建一个空的 short.yaml 配置文件。这个文件定义了您的项目目录。此文件夹及其子文件夹中所有的 short 命令都以此配置文件为参考。

$> sht init

short.yaml(生成)

setups: {}

generate 设置。

生成一个 空的 设置或从 项目模板 仓库,此命令也可以列出所有可用的项目模板。

✍ 生成一个空的设置 ️
参数 必需 描述
<setup_name> yes 设置名称
<env_name> yes 环境名称
<kind> yes 文件类型 [sh,bash ...]
选项 允许为空* 默认 描述
-d , --directory yes <setup_name> 目标目录。
-p , --private no false 🔒 保存到私有目录。 [与"-d"冲突]
-f , --file no run.sh 脚本路径,如果缺失则创建目录。 [与"-d"冲突]
-e , --env-directory no . 公共环境目录。 [与"-d"冲突]

示例:创建一个名为 my_setup 的设置,具有 .test 环境文件和 bash 脚本。

$> sht generate my_setup test bash 

short.yaml(生成):配置文件。

setups:
  my_setup:
    file: run.sh
    array_vars:
      all:
        pattern: ".*"
        case: CamelCase
        format: "[{key}]='{value}'"
        delimiter: " "
    vars: []

.test(生成):环境文件。

VAR1=VALUE1
VAR2=VALUE2

run.sh(生成):可执行文件。

#!/bin/bash
declare -A all && eval all=($ALL)

declare -p all

第二行 declare -A all && eval all=($ALL) 允许使用 bash 关联数组

🌱 列出所有 项目模板
$> sht generate -l
🌱 从项目模板生成设置
参数 必需 描述
<setup_name/template> yes 设置名称或 <template> 名称,使用 "-t" 选项留空
选项 允许为空* 默认 描述
-t , --template yes <setup_name> 模板名称,可以在模板列表 -l 中找到
-d , --directory yes <setup_name> 目标目录。

示例:创建一个包含其相关环境的 node-express 设置。

$> sht generate node-express -t

👉 short.yaml(生成)run.sh(生成) 来自以下项目模板: node-express

run 设置

运行 可执行脚本

📜 详细信息
参数 必需 描述
<args>... no 所有参数都将作为参数传递给可执行脚本。
$> sht run

rename 设置

重命名设置。例如 my_setup -> another_setup

$> sht rename my_setup another_setup

new 环境

创建新环境。例如 dev

$> sht new dev

或私有环境。例如 prod

$> sht new dev -p

🔒 -p 将文件保存在私有目录中。

sync 环境

同步所有环境,并询问您对每个差异进行什么操作。

$> sht sync

edit 环境

使用您的默认文本编辑器编辑环境文件。您可以使用 --editor <editor>EDITOR 环境变量选择不同的编辑器。

$> sht edit

dir 环境目录

设置或取消环境目录。

$> sht dir ./envs/
$> sht dir --unset

pdir 环境私有目录

设置或取消环境目录。

$> sht pdir ../private_envs/
$> sht pdir --unset

--u:选择/切换设置/环境

📜 详细信息
参数 必需 描述
<setup/environment> yes 设置名称或环境名称,如果已经指定了另一个。
<environment> no 环境名称。

在这个例子中,我们有两个名为 my_setup_1my_setup_2 的设置,以及两个名为 devprod 的环境文件。我们必须选择设置和环境 dev,并将环境切换到 prod

例如,选择带有 dev 环境的 my_setup_1

$> sht use my_setup_1 dev

例如,从 dev 切换到 prod 环境。

$> sht use prod

👉 如果已经选择了设置和环境,您可以避免提供设置,只需指示您想要的环境。

现在我们切换到第二个设置 my_setup_2。为此,我们必须指定设置 环境。

例如,在保持 prod 环境的情况下,从 my_setup_1 切换到 my_setup_2

$> sht use my_setup_2 prod

show 显示当前设置/环境

📜 详细信息
选项 默认 描述
-f, --format [{设置}:{环境}] 显示格式
$> sht show
💁 your current setup is `my_setup`:`dev`

👉 此命令可用于在 shell 的提示部分显示当前设置/环境。因此,您可以使用选项 -f(格式)。此选项删除换行符,您可以将格式格式化为您想要的格式。默认值为 [{setup}:{env}]

  • {setup} 将被替换为当前设置名称。
  • {env} 将被替换为当前环境名称。
完整示例

在这个例子中,我们有一个名为 my_setup 的设置和两个名为 devprod 的环境文件。我们必须选择设置和环境 dev,并将环境切换到 prod

$> sht use my_setup dev
$> sht show
💁 your current setup is `my_setup`:`dev`
$> sht use prod
$> sht show
💁 your current setup is `my_setup`:`prod`

ls 列出所有设置和环境

列出所有设置/环境并指示当前一个,如 sht show

$> sht ls
  my_project (run.sh)
     prod (.prod)
     dev (.dev)
  my_sub_project_1 (my_sub_project_1/run.sh)
     prod (sub_env/.prod)
     staging (sub_env/.staging)
     test (sub_env/.test)
  my_sub_project_2 (my_sub_project_2/run.sh)
>    prod (sub_env/.prod)
     staging (sub_env/.staging)
     test (sub_env/.test)

vars 显示/比较映射环境变量

如你所见,通过变量的 说明。有两个显示环境变量(大写)和变量(小写)。

<variable> | <ENVIRONMENT_VARIABLE> | <value>
    ..     |           ..           |   ..

当变量是数组时,将显示如下。

<variable> | <ENVIRONMENT_VARIABLE> (<pattern>) `case`
           | <IN_ARRAY_ENVIRONMENT_VARIABLE> | <value>
           |           ..                    |    ..

例如,显示 test 当前环境的变量映射。

$> sht vars
                           | test
 all         | ALL (.*)
             | VAR1        | VALUE1
             | VAR2        | VALUE2
 var1        | VAR1        | VALUE1
 var2        | VAR2        | VALUE2
 short_setup | SHORT_SETUP | my_sub_project_2
 short_env   | SHORT_ENV   | test

例如,比较 testprod 环境的变量映射。

$> sht vars -e prod test
                           | prod             | test
 all         | ALL (.*)
             | VAR1        | VALUE1           | VALUE1
             | VAR2        | VALUE2_OF_PROD   | VALUE2
 var1        | VAR1        | VALUE1           | VALUE1
 var2        | VAR2        | VALUE2_OF_PROD   | VALUE2
 short_setup | SHORT_SETUP | my_sub_project_2 | my_sub_project_2
 short_env   | SHORT_ENV   | prod             | test

envs 显示/比较环境变量

例如,显示 test 当前环境的变量。

$> sht vars
      | test
 VAR1 | VALUE1
 VAR2 | VALUE2

例如,比较 testprod 环境的变量。

$> sht vars -e prod test
      | prod           | test
 VAR1 | VALUE1         | VALUE1
 VAR2 | VALUE2_OF_PROD | VALUE2

配置文件 short.yaml

setups:
  <setup_name>: # Setup.name : String
    file: run.sh # Setup.file : Path - Required
    public_env_dir: env/ # Setup.public_env_dir : Path - Optional
    array_vars: # Map<ArrayVar.name,ArrayVar|Regex> : Optional
      <group1>: ".*" # String, It's a short way to set only ArrayVar.pattern.
      <group2>:      # ArrayVar
        pattern: PREFIX_.*           # ArrayVar.pattern : Regex - Required
        case: CamelCase              # ArrayVar.case : Enum<Case> - Optional
        format: "[{key}]='{value}'"  # ArrayVar.format : String - Optional
        delimiter: " "               # ArrayVar.delimiter : String - Optional
    vars: []       # Vars

<...> 表示您可以放入任何属性名称。

Setup.name

设置名称

Setup.file

指向可运行脚本的路径。

Setup.public_env_dir

指向项目子目录的路径。

ArrayVars

此配置允许在单个环境变量中分组并应用自定义格式和映射。

环境文件

VAR1=VALUE1
VAR2=VALUE2
PREFIX_VAR1=P_VALUE1
PREFIX_VAR2=P_VALUE2

环境变量将被注入,有关详细信息,请参阅 ArrayVar.format

GROUP1 => VAR1:VALUE1,VAR2:VALUE2,PREFIX_VAR1:P_VALUE1,PREFIX_VAR2:P_VALUE2
GROUP2 => [PrefixVar1]='P_VALUE1' [PrefixVar2]='P_VALUE2'

ArrayVar.pattern(正则表达式)

所有与该模式匹配的变量将被分组。

更多信息请参阅 lib(regex)* 中使用的说明。

ArrayVar.case

为每个变量应用一个情况。

可用的情况
驼峰命名法
snake_case
SHOUTY_SNAKE_CASE
mixedCase
标题化

更多信息请参阅 lib(heck)* 中使用的说明。

ArrayVar.format

应用于每个变量的格式,并将这些格式连接成一个字符串。可以使用两种数据:{key}{value}

👉 默认情况下(sh),应用格式 {key}:{value}

👉 默认情况下(bash),它应用bash关联数组格式 [{key}]='{value}' (文档)

ArrayVar.delimiter

注入到数组中每个变量之间的字符串。

👉 默认情况下,它是单个空格 " "。

Vars[var]

在这里设置的变量将被选择用于注入。

👉 必须与环境变量 匹配

👉 如果没有指定,则选择 所有变量

👉 如果它是空的,如 vars: [],则选择任何变量。

帮助

USAGE:
    sht [SUBCOMMAND]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    init        Init project, create an empty "short.yaml" configuration file.
    generate    Generate empty setup or from project template repository.
    run         Run setup [ARGS...].
    rename      Rename setup.
    new         Create env file ".<env>", in public directory by default.
    sync        Sync env files.
    edit        Edit env file.
    dir         Public env directory, [.] by default.
    pdir        Private env directory, unset by default.
    use         Switch of current setup or/and environment.
    show        Show your current setup.
    ls          Display setups and environments available.
    vars        Display/Diff mapping environment variables.
    envs        Display/Diff environment variables.
    help        Prints this message or the help of the given subcommand(s)

概念

项目 short.yaml

它是一个包含配置文件 short.yaml 的目录,该文件定义了 项目根目录
此目录及其子目录中的所有 short 命令都将参考此配置文件。

  • 要创建/初始化项目,请参阅 init 命令。

设置

设置是short的主要概念。设置配置在 short.yaml 中描述,您可以添加多个。它需要 名称、一个 可执行文件公共环境目录映射选项。这就是short如何轻松地简化运行命令。

👉 每个设置只能有一个 可执行文件

  • 要创建/生成设置,请参阅 generate
  • 要列出所有设置,请参阅 ls 命令。
  • 要显示设置的映射,请参阅 vars 命令。

目录(公共/私有)

这些目录存储 .<env> 文件。存在于这些目录中的环境文件将相互同步。如果它们设置为相同的 配置

公共目录

此目录必须在您的项目内部(默认值是项目的根目录 根文件夹)。这可以是子目录,例如 ./env/,有关更多详细信息,请参阅 配置设置。因此,如果您已配置git或另一个代码版本控制系统,公共目录允许将非关键配置文件(例如示例配置文件)与代码一起保存。

.
└── project
    ├── envs # public env directory
    │   └── .dev
    ├── ...
    └── short.yaml
  • 有关 设置/取消设置 公共目录,请参阅 dir 命令。

私人目录 🔒

此目录必须在您的项目外部。私人目录的路径将不会存储在 项目配置 ✅ 中!因此,如果您已配置git或另一个代码版本控制系统,则该目录将永远不会与您的代码一起提交,并且私人目录的任何线索都将出现在简短配置 short.yaml 中。

.
├── envs # private env directory
│   └── .dev
└── project
    ├── run.sh
    └── short.yaml
  • 有关 设置/取消设置 私人目录,请参阅 pdir 命令。

环境文件 .<environment_name>

每个环境文件定义一个环境,以便环境名称来自文件名,如 .<my_env> 环境文件 => my_env 环境名称

👉 前缀 . 是必须的

文件格式必须遵循 RFC 2 – .env文件 指南。

# Comment

VAR1=VALUE1
VAR2=VALUE2

同一设置(公共环境目录/私人环境目录)内的每个环境都相互 同步。因此,值可以更改,但 变量、变量顺序、空格、注释 将保持相同。

  • 有关 创建 新的环境文件,请参阅 new 命令。
  • 有关 列出 所有环境文件,请参阅 ls 命令。
  • 有关 显示 环境文件的内容,请参阅 envs 命令。
  • 有关 编辑 环境文件,请参阅 edit 命令。

变量

变量可以来自 环境文件 或在 配置文件 中指定:array_varsvars

👉 作为 环境变量 注入到脚本中,变量名称将转换为 UPPER_CASE。(另请参阅 vars 命令)。

👉 作为变量表示,它们始终转换为 lower_case。(另请参阅 vars 命令)。此显示仅用于命令行输出的可读性,如 vars 命令。

选项允许为空

类似于 -d 的选项,可以在 sht generate my_template my_env -d 中找到,可以有三种状态。

  1. 禁用 未指定选项:例如,sht generate my_template my_env
  2. 激活;默认值:例如 sht generate my_template my_env -d -d 的值是 my_template
  3. 带值激活:例如 sht generate my_template my_env -d foo-d 的值是 foo

依赖项

~23–39MB
~652K SLoC