#template #create #productivity #generate #setup #structure #cli-tool

app proplate

Proplate 是一款 CLI 工具,允许您快速创建和设置基于模板的项目结构,并为您的未来项目创建自己的模板。

6 个版本

0.5.1 2024 年 4 月 1 日
0.5.0 2024 年 3 月 14 日
0.4.1 2024 年 2 月 24 日
0.4.0 2024 年 1 月 21 日
0.3.1 2024 年 1 月 8 日

命令行工具 中排名第 281

MIT 许可证

65KB
1.5K SLoC

Proplate 🛠⚙


每次开始使用相同技术的新项目时,放弃设置环境;相反,创建一个模板并用于所有即将到来的项目。

目录

  1. 安装
  2. 使用模板创建项目
  3. 创建自己的模板

安装

先决条件: git

GitHub 发布

您可以从 发布页面 下载。
我建议在您的终端中全局可用。 (wip: install.sh)

Cargo

如果您已安装 cargo

cargo install proplate

cargo 将直接在您的 $PATH 中提供

使用模板创建项目

proplate create --template <location> --dest <output_dir>

location 可以是 GitHub 仓库或本地目录

为了测试目的,我将留下此模板 https://github.com/YumeT023/proplate-simple-npm-template
运行以下命令从上述模板开始您的项目

proplate create --template https://github.com/YumeT023/proplate-simple-npm-template --dest your-project-name

注意:如果您希望 proplate 为您初始化一个 git 仓库,请添加 --git

此时,... 与 Proplate 交流:D

创建自己的模板

参考

  • Proplate 模板是一个包含 meta.json 的目录

通过实践学习

示例模板可以在 https://github.com/YumeT023/proplate/tree/master/examples/learn-by-doing 找到

最小的模板配置

最小的配置如下

{
  "id": "initial-template",
  "args": []
}

参数

那么 "args" 是什么意思?

Proplate 使用它们在模板初始化期间创建交互式提示。

您可以使用 Proplate 获取两种输入类型: SelectText

"args": [
  {
    "key": "project_name",
    "q_type": "Text",
    "label": "Enter your project name"
  }
]

文本输入渲染如下

text input

让我们尝试为许可证添加一些 options 的选择输入

"args": [
  {
    "key": "project_name",
    "q_type": "Text",
    "label": "Enter your project name"
  },
  {
    "key": "license",
    "q_type": "Select",
    "label": "Select a license for your project",
    "options": ["MIT", "BSD-2-Clause", "none"]
  }
]

选择输入渲染如下

select input

... 但现在... 是什么? args 是什么:( ?

上下文绑定

argscontext 用于替换特定文件中的变量绑定,这些文件被称为 dynamic files

如何编写动态文件?

... 非常简单:$var_name,在我们的例子中 $license$project_name

让我们添加一个 README.md 动态文件,如下所示

README.md

# $project_name

licensed under $license

运行 proplate

proplate create --template learn-by-doing --dest dynamic-uh

让我们打开输出 dynamic-uh/README.md

...

我们真的做到了 ✨

dynamic-uh

如何让 proplate 知道我想以原样写入 $not-binding

只需转义它们 -uh

README.md

# $project_name

licensed under $license

hey proplate, leave this one \$not-binding

我的意思是...

no-dynamic-uh

你可以创建任意多的文件并添加绑定,Proplate 会处理它们

更多关于动态文件的信息

附加操作

有时,你想要做的不仅仅是替换动态文件。Proplate 已经为你准备好了。

目前,proplate 支持 2 个基本的 fs 操作:RemoveCopyCopyDir

这些操作在 "additional_operations" 下枚举

... 假设我们只想无理由地删除某些东西

将文件 SIMPLY_DELETE 添加到你的模板目录中。

{
  "additional_operations": [
    {
      "operations": [
        {
          "Remove": {
            "files": ["SIMPLY_DELETE"]
          }
        }
      ]
    }
  ]
}

你可以在 "operations" 下添加任意多的操作

... 但是等等,"additional_operations" 有点奇怪... 为什么不直接省略 SIMPLY_DELETE 文件呢?

当有条件地执行时,删除和复制变得更加实用... Proplate 可以做到这一点!!

让我们稍微修改一下模板

MIT 添加到 ".proplate_aux_utils" 目录中(默认情况下,此目录会被忽略 更多信息

MIT

添加 $author 绑定;)

MIT License

Copyright (c) 2024 $author

...

现在,只有当选择 MIT 许可证时,才将 MIT 复制到 LICENSE 文件中

{
  "args": [
    {
      "key": "author",
      "q_type": "Text",
      "label": "Who is da author"
    }
    ...
  ],
  "additional_operations": [
    {
      "conditions": [
        {
          "lhs": "$license",
          "op": "Eq",
          "rhs": "MIT"
        }
      ],
      "operations": [
        {
          "Copy": {
            "file": ".proplate_aux_utils/MIT",
            "dest": "LICENSE"
          }
        }
      ]
    }
    ...
  ]
}
proplate create --template learn-by-doing --dest additional-op-uh

支持的条件操作有:EqNotEq

- 你可能会说 -

我们不能直接运行一些 bash 脚本-uh?... 为了你的安全,

一些额外功能

  • "dynamic_files":如果你不包含此属性,proplate 将将模板文件视为动态。

    • 对于较大的模板,你可能希望明确指定哪些文件是动态的。你可以在 "dynamic_files" 属性下枚举,如下所示,你可以枚举 "files" 或 "directories"。然而,此时,其余的文件/目录变为静态

      {
        "dynamic_files": ["package.json", "directory"]
        ...
      }
      
  • "exclude":我之前告诉你,".proplate_aux_utils" 默认情况下(辅助)会被忽略,这意味着它不会被直接包含在模板中。但也许在稍后的 "additional_operations" 期间

    • 你还可以在 "exclude" 下添加自己的辅助目录/文件。

      注意:"meta.json"".proplate_aux_utils" 已预先排除

      {
        "exclude": [".git", "node_modules"]
        ...
      }
      
  • "args":类型为 Text 的输入可能具有 "default_value" 属性,proplate 将将其用作占位符

  • "additional_op" 操作列表

    • 复制 { 文件, 目标 }
    • 复制目录 { 路径, 目标 }
    • 删除 { 文件 }

依赖关系

~7–20MB
~208K SLoC