最近在翻一些命令行的执行程序,因为工作性质,想找一些简化输入而且能提高视觉效果的命令行工具,找来找去,发现Rust 语言的朋友们开发了很多这种可替代的命令行工具,就顺便研究了一下,不过发现一个现象,像我这种多重工作于一身的人,在解决线上问题的时候需要快准狠的方式,就必须要求这个程序在我哪怕是拷贝的时候,体积都要绝对得小,如此这般,我把自己对这些程序的瘦身过程列在了下面。
首先看一下Rust 语言的一些命令行替代工具:
汇总Rust 一些开发的命令行工具(内容摘自知乎的一个留言里)
命令 | 替代对象 | 命令 | 替代对象 |
bat | cat | exa | ls |
lsd | ls | fd | find |
procs | ps | sd | sed |
dust | du | ripgrep | grep |
bottom | top | teeldear | tldr |
oxide | cd | starship | 现代化命令行提示 |
tokie | 代码行数统计 | hyperfine | benchmark 测试 |
grex | 正则生成 | bandwhich | 进程网络情况 |
delta | git 的可视化 | nushell | 现代化shell |
mcfly | 替代ctll-R 命令搜索 | fselect | 使用SQL 查询文件 |
我发现lsd 和 procs 都很不错,既能高亮显示,还能定义颜色,甚至能提供一些非常棒的操作,而这些操作如果通过默认的工具实现,可能要经过很复杂的交叉执行,比如管道和正则结合等。
接下来以编译安装lsd 为例来展示我是如何编译出可执行文件lsd 并将其压缩成很小的体积。
首先下载源码,从github直接copy 到本地
开始编译安装
编译完的目标执行文件有64M(debug 就是这么大,没有用release 方式就是想展示压缩过程), 这样的体积给咱们感觉一个仿 ls 的Rust 程序,居然能达到golang 二进制代码的腰围,真的不可思议,看来着实要给她减减肥了。
开始压缩可执行文件:
压缩文件有很多种方式,但是最终的原理都是一样的,好比你去自驾游,你会搜寻很多路线,但是最终的目的地都是一样的,万变不离其宗。
1. 一种是手动操作,直接手动去除没必要的debug 等信息,采用strip 方式‘“净化环境”,然后用压缩工具将其完全静态化。
咱们可以详细得看一下,目前程序都包含啥
可以看到,debug 的相关信息都在其中,要不怎么那么大,现在可以祛除没必要的信息了,用strip 命令来删除里面的非重要内容:
这次只有8.0M了,查看一下debug 信息,发现已经没有了。
接下来还可以继续瘦,用upx 工具压缩一下,将其完全静态化
看到了吧,1.3M, 已经被压成“柿饼”了,这个size 还是可以接受的。
2. 另外一种压缩的方法就是使用musl库静态编译rust程序
musl 是轻量级的libc库,与glibc 比较,它的代码更简洁,体积也小,更方便得静态编译程序,所以就能够将musl 以及第三方C库静态链接到Rust的可执行文件中。
准备工作:
安装rust musl 工具链
# 安装musl工具链
$sudo rustup target add x86_64-unknown-linux-musl
# 对于CentOS 8 先下载仓库包
$ wget https://forensics.cert.org/cert-forensics-tools-release-el8.rpm
$ sudo rpm -Uvh cert-forensics-tools-release-el8.rpm
$ sudo dnf install musl-gcc
然后就可以直接编译了,编译的时候带上target 就行了
编译完成后,发现体积也是1M多,而且静态化处理了
总结:
通过对Rust 可执行文件的体积压缩,我只是想展示在程序开发过程中其实有好多东西都需要去挖掘和探索,上述的各个步骤有可能我省略了一些细节,但是也不能掩盖最终目的,就是在开发的过程中,我们要不断得优化各个细节,就像钓鱼一样,你要不断的尝试每一个水域,才能获悉哪里的鱼多而肥。