最近在翻一些命令行的执行程序,因为工作性质,想找一些简化输入而且能提高视觉效果的命令行工具,找来找去,发现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 到本地

rustdesk 本地编译安装_后端

开始编译安装

rustdesk 本地编译安装_Rust_02

编译完的目标执行文件有64M(debug 就是这么大,没有用release 方式就是想展示压缩过程), 这样的体积给咱们感觉一个仿 ls 的Rust 程序,居然能达到golang 二进制代码的腰围,真的不可思议,看来着实要给她减减肥了。

rustdesk 本地编译安装_rust_03

开始压缩可执行文件:

        压缩文件有很多种方式,但是最终的原理都是一样的,好比你去自驾游,你会搜寻很多路线,但是最终的目的地都是一样的,万变不离其宗。

1. 一种是手动操作,直接手动去除没必要的debug 等信息,采用strip 方式‘“净化环境”,然后用压缩工具将其完全静态化。

咱们可以详细得看一下,目前程序都包含啥

rustdesk 本地编译安装_rustdesk 本地编译安装_04

可以看到,debug 的相关信息都在其中,要不怎么那么大,现在可以祛除没必要的信息了,用strip 命令来删除里面的非重要内容:

rustdesk 本地编译安装_Rust_05

这次只有8.0M了,查看一下debug 信息,发现已经没有了。

rustdesk 本地编译安装_rustdesk 本地编译安装_06

接下来还可以继续瘦,用upx 工具压缩一下,将其完全静态化

rustdesk 本地编译安装_rustdesk 本地编译安装_07

看到了吧,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 就行了

rustdesk 本地编译安装_rustdesk 本地编译安装_08

编译完成后,发现体积也是1M多,而且静态化处理了

rustdesk 本地编译安装_后端_09

总结: 

       通过对Rust 可执行文件的体积压缩,我只是想展示在程序开发过程中其实有好多东西都需要去挖掘和探索,上述的各个步骤有可能我省略了一些细节,但是也不能掩盖最终目的,就是在开发的过程中,我们要不断得优化各个细节,就像钓鱼一样,你要不断的尝试每一个水域,才能获悉哪里的鱼多而肥