使用 Stow 管理 Linux 上的包
我一直有一个疑惑:当我 make install
之后,怎么删掉这个包?
随着我对 Linux 的了解逐渐加深,我有了一个构想:如果我能记录下 make install
时安装到 /usr/local
目录下的所有文件,我就能在不需要它们时将它们一起删掉
后来我学到了软链接,我想到了更好的办法:我可以在安装时设置将软件的 --prefix
到一个独立的目录,然后为这些文件创建到 /usr/local
目录的软链接。而且这似乎是一种非常符合 Unix 哲学的想法,这时我发现了 GNU Stow
1. 安装 Stow
要在 Ubuntu 上安装 Stow,运行下面这条命令:
sudo apt install stow
2. 使用方式
运行下面这条命令可以查看帮助信息:
stow --help
输出的帮助信息如下:
stow (GNU Stow) 版本 2.3.1
概要:
stow [选项 ...] [-D|-S|-R] 软件包名 ... [-D|-S|-R] 软件包名 ...
选项:
-d 目录, --dir=目录 设置 stow 目录为指定目录(默认为当前目录)
-t 目录, --target=目录 设置目标目录为指定目录(默认为 stow 目录的父目录)
-S, --stow 存储(stow)后续列出的软件包
-D, --delete 删除(unstow)后续列出的软件包
-R, --restow 重新存储(相当于先执行 stow -D 再执行 stow -S)
--ignore=正则表达式 忽略匹配此 Perl 正则表达式结尾的文件
--defer=正则表达式 如果文件已被其他软件包存储,则推迟存储以该正则表达式开头的文件
--override=正则表达式 如果文件已被其他软件包存储,仍强制存储以该正则表达式开头的文件
--adopt (谨慎使用!)将目标目录中的现有文件整合到 stow 软件包中。使用前请阅读文档。
-p, --compat 使用旧算法进行卸载(unstow)
-n, --no, --simulate 仅模拟操作,不实际修改文件系统
-v, --verbose[=N] 增加详细输出级别(级别范围为 0 到 5;
-v 或 --verbose 增加 1 级;--verbose=N 直接设置级别)
-V, --version 显示 stow 版本号
-h, --help 显示本帮助信息
错误报告请发送至: bug-stow@gnu.org
Stow 主页: <http://www.gnu.org/software/stow/>
GNU 软件使用帮助: <http://www.gnu.org/gethelp/>
3. 示例
以在 Linux 上编译安装 Nginx (1.27.4) 为例
首先下载 Nginx 的源码包
mkdir -p ~/Downloads
cd ~/Downloads
curl -O https://nginx.org/download/nginx-1.27.4.tar.gz
tar -xzvf nginx-1.27.4.tar.gz
然后安装必要的依赖
sudo apt update && sudo apt upgrade
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev
接着进行配置和编译
注意我们将安装目录设置为了 /usr/local/stow/nginx-1.27.4
cd nginx-1.27.4
./configure --prefix=/usr/local/stow/nginx-1.27.4
make
最后进行安装
sudo make install
安装完成后我们去看一下安装了哪些文件
cd /usr/local/stow
tree nginx-1.27.4
输出的目录结构如下:
nginx-1.27.4/
├── conf
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf
├── html
│ ├── 50x.html
│ └── index.html
├── logs
└── sbin
└── nginx
5 directories, 18 files
可以看到,一个标准的 Nginx 包结构已经安装到了 /usr/local/stow/nginx-1.27.4
目录下
接下来就到了 Stow 起作用的时候了,非常简单,我们在 /usr/local/stow
目录下运行这条命令
sudo stow nginx-1.27.4
我们的 Nginx 已经准备好开始使用了:
which nginx
# /usr/local/sbin/nginx
nginx -v
# nginx version: nginx/1.27.4
启动 Nginx
sudo nginx
curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
成功了!
要删除 Nginx 包,只需要在 /usr/local/stow
目录下运行这条命令
sudo stow -D nginx-1.27.4
它会自动删除之前为 Nginx 包创建的软链接,这时我们就可以愉快地 rm -rf
了
sudo rm -rf nginx-1.27.4
这样我们就实现了对软件包的完美删除