#directory-tree #packaging #tool #path #source #directory-structure #overlays

app turboinstall

一个简单的工具,用于将目录树叠加在一起

7 个版本

0.3.4 2023年4月9日
0.3.3 2023年2月18日
0.3.1 2023年1月22日
0.2.0 2023年1月7日
0.1.0 2023年1月5日

#580 in 文件系统

每月 43 次下载

MIT 许可证

41KB
1K SLoC

turboinstall

⚠️ 警告: 此工具尚未完成,存在一些错误。

一个快速且简单的目录树叠加工具。

目录

这意味着什么?

这意味着您可以轻松地将文件安装到正确的位置,而无需编写任何自定义安装脚本。只需在源树内部复制您需要的结构即可,其余的将由工具处理。

谁需要这个?

您是否曾经需要创建某种目录分层以打包应用程序?实际上,这个工具是为了满足一个非常具体的需求:我的 zeus 项目的运行时系统,以及该打包方式。

如果您决定尝试这个工具,请注意,可能存在许多错误(尤其是在路径遍历方面),请谨慎使用。

特性

  • 🌲 在彼此之上叠加多个源目录树
  • ✂ 路径变量展开(基本上是路径替换)
  • 🪪 4 种不同的配置文件格式(json,toml,yaml,env)
  • 🪝 用于自定义动作的钩子
  • 🌈 美观的颜色
  • 📏 定义正则表达式规则以忽略路径(如 .gitignore)的能力
  • 🔒 保留文件权限
  • 🐚 Shell 完整性

平台特定

Unix

  • ⏰ 保留文件的所有权和时间戳
  • 🐮 创建 CoW 文件系统副本(需要文件系统的支持(btrfs,xfs,...))

安装

如果您需要此类工具,则很可能已安装 rustcargo。在这种情况下

cargo install turboinstall

使用方法

Unix 命令行参数
A simple tool for overlaying directory trees on top of each other

Usage: turboinstall [OPTIONS] <dir> [dir]...

Arguments:
  <dir>     Destination directory
  [dir]...  Overlay source(s)

Options:
  -p, --profile </path/to/profile>  Path to the file with the profile definition [default: .turboinstall.json]
  -f, --format <fmt>                Specify which format the profile uses [possible values: json, toml, yaml, env]
  -l, --link                        Hard link files instead of copying
  -n, --no-clobber                  Do not overwrite existing files
  -u, --update                      Overwrite only when the source path is newer
  -q, --quiet                       Don't print anything to the console
      --ignore <path,path,...>      Paths to extra ignore files
      --no-abort                    Don't exit on error
      --dry-run                     Do not perform any filesystem operations (implies --no-hooks)
      --no-hooks                    Do not run any hooks
      --hooks <type,type,...>       Only run these types of hooks [possible values: pre-install, post-install]
      --porcelain                   Use machine readable output
      --preserve <attr,attr,...>    Preserve the specified attributes [possible values: ownership, timestamps]
      --reflink <when>              Create clone/CoW copies [default: auto] [possible values: never, always, auto]
  -h, --help                        Print help information
  -V, --version                     Print version information```

简而言之,此工具做一件事。它将一个目录树(src)像这样

 src/
├──  dir1/
│   ├──  dir2/
│   │   └──  file2
│   └──  file1
└──  file0

并将其复制到另一个目录(dst)像这样

 dst/
├──  dir1/
│   ├──  dir2/
│   │   └──  file2
│   └──  file1
└──  file0

执行此操作的命令是

turboinstall ./dst ./src

忽略文件

忽略文件是一个简单的文本文件,位于 .turboinstall/ignore,其中包含大家最喜欢的正则表达式 🎉。文件的每一行包含一个正则表达式模式,该模式将匹配覆盖中的每个路径。换句话说,就像 .gitignore 文件一样。可以在命令行上使用 --ignore 指定其他忽略文件,相对路径将从覆盖根目录解析,而绝对路径将正常解析。

假设我们有一个源树

 src/
├──  .turboinstall/
│   └──  ignore
├──  dir0/
│   ├──  dir1/
│   │   ├──  file1
│   │   └──  file2
│   └──  file0
└──  file0

并且 src/.turboinstall/ignore 包含

# This is a comment
# Empty lines are also ignored

/file0

这意味着当我们运行 turboinstall ./dst ./src 时,我们会得到

 dst/
└──  dir0/
    └──  dir1/
        ├──  file1
        └──  file2

注意 src/file0src/dir0/file0 都缺失了。这是因为与 gitignore 文件不同,这些文件在路径上使用纯正则表达式进行匹配。忽略文件中的模式 /file0 匹配以下两个

  • /file0
  • /dir0/file0

好吧,那么我们如何 匹配 /file0 呢?只要你了解基本的正则表达式,这很简单。只需在模式前添加 ^,这意味着:只有在路径开始处匹配以下内容,因此我们的忽略文件变为

# This is a comment
# Empty lines are also ignored

^/file0

在这个例子中,要测试的路径是

  • /dir0
  • /dir0/dir1
  • /dir0/dir1/file1
  • /dir0/dir1/file2
  • /dir0/file0
  • /file0

注意:任何位于 /.turboinstall 文件夹内部的内容都将自动忽略,无法更改这一点。

配置文件和路径展开

配置文件是一种高级说法,意思是 configuration filevariable store。它是存储路径扩展变量的一种支持格式的文件(见 功能)。

注意:路径扩展尚未完全完成,但它是功能性的

配置文件仅用于路径扩展,不用于其他任何用途,如果你根本不打算使用此功能,则不需要它们。

以下示例以相同的方式工作,只是表达方式不同。这使得工具很容易与其他自定义工具集成。env 格式特别有用,因为你可以直接从 shell 脚本中 source 它。

你可以使用 -p 指定自定义配置文件。

以下配置文件可用于路径扩展。因此,与前面的示例相比,它会将以下内容转换为

 src/
├──  file
└──  {DIR}/
    ├──  test/
    │   └──  file
    └──  file_{VARIABLE_1}

 dst/
├──  file
└──  usr/
    └──  local/
        ├──  test/
        │   └──  file
        └──  file_VALUE_1

通过这种方式,你只需在命令行上指定另一个配置文件,就可以从易于理解的一个源树创建不同的输出。例如,这可以让你从一个源树和大量配置文件中为不同的系统构建不同的文件系统层次结构的软件包。

不再需要烦人的安装脚本。

执行此操作的命令是

turboinstall ./dst ./src -p example_profile.json

其中 example_profile.json 是以下示例配置文件之一。它不需要命名为这样,只需是一个带有相应扩展名的普通文件即可,否则你需要使用 -f 指定格式。

示例配置文件

JSON
{
  "VARIABLE_1": "VALUE_1",
  "DIR": "/usr/local"
}
TOML
VARIABLE_1 = "VALUE_1"
DIR = "/usr/local"
YAML
VARIABLE_1: "VALUE_1"
DIR: "/usr/local"
ENV
# This is a comment

VARIABLE_1=VALUE_1
DIR="/usr/local"

钩子

钩子只是放置在特殊位置的执行文件,它们按照通配符顺序(字母数字)执行,并带有两个参数

  1. 源树
  2. 目标树

这些文件的特殊位置位于源树的根目录下,在一个名为 .turboinstall 的文件夹中,换句话说,这就是您的源树应该看起来像的样子

 src/
├──  .turboinstall/
│   ├──  post-install/
│   │   └──  some_hook.sh
│   └──  pre-install/
│       ├──  00-hook.sh
│       └──  10-another_hook.sh

钩子的执行顺序如下

安装前钩子

  1. 00-hook.sh
  2. 10-another_hook.sh

安装后钩子

  1. some_hook.sh

在安装前钩子中,严格来说并不需要遵循这里显示的命名约定,但它清楚地表明了钩子执行的顺序。

钩子环境

钩子使用 2 个参数调用

  1. 它们所在的源树路径
  2. 目标树路径

它们的当前工作目录保持不变,与运行 turboinstall 的目录相同。这使得钩子可以访问任何可能相关但不在源树中的其他文件。

预安装

.turboinstall/pre-install 中的可执行文件,如名称所示,是在实际源树复制之前运行的。

后安装

.turboinstall/post-install 中的可执行文件,如名称所示,是在源树复制之后运行的。

依赖项

~8–20MB
~226K SLoC