![FreeBSD ports:想要重新编译所有东西,一些包因为“卸载错误”/“已经安装”而失败](https://linux22.com/image/181544/FreeBSD%20ports%EF%BC%9A%E6%83%B3%E8%A6%81%E9%87%8D%E6%96%B0%E7%BC%96%E8%AF%91%E6%89%80%E6%9C%89%E4%B8%9C%E8%A5%BF%EF%BC%8C%E4%B8%80%E4%BA%9B%E5%8C%85%E5%9B%A0%E4%B8%BA%E2%80%9C%E5%8D%B8%E8%BD%BD%E9%94%99%E8%AF%AF%E2%80%9D%2F%E2%80%9C%E5%B7%B2%E7%BB%8F%E5%AE%89%E8%A3%85%E2%80%9D%E8%80%8C%E5%A4%B1%E8%B4%A5.png)
pkg install
很长一段时间只用via的二进制包。然后必须从源代码编译一个包,因为必须激活其他选项。由于进展顺利,我想完全切换到/usr/ports
这台机器上。
清理(从某处得到这个):
pkg autoremove
portsclean -C -D -DD
portsnap auto
portsclean -C -D -DD
然后做portupgrade -af --batch
。该命令的结果是:
** Listing the failed packages (-:ignored / *:skipped / !:failed)
! multimedia/libvpx (libvpx-1.9.0) (uninstall error)
! databases/db5 (db5-5.3.28_7) (uninstall error)
* databases/ruby-bdb (ruby26-bdb-0.6.6_8)
* ports-mgmt/portupgrade (portupgrade-2.4.16,2)
* devel/apr1 (apr-1.7.0.1.6.1_1)
[...]
...然后还有更多跳过的包。
root:/usr/ports/multimedia/libvpx # make install
===> Installing for libvpx-1.9.0
===> Checking if libvpx is already installed
===> libvpx-1.9.0 is already installed
You may wish to ``make deinstall'' and install this port again
by ``make reinstall'' to upgrade it properly.
If you really wish to overwrite the old port of libvpx
without deleting it first, set the variable "FORCE_PKG_REGISTER"
in your environment or the "make install" command line.
*** Error code 1
Stop.
make: stopped in /usr/ports/multimedia/libvpx
类似对于databases/db5
.所以我在两个目录中执行并make deinstall
重新开始。但它以类似的信息结束,这似乎更糟糕;这里只列出以下行:make reinstall
portupgrade -af --batch
!
! multimedia/libvpx (libvpx-1.9.0) (uninstall error)
! databases/db5 (db5-5.3.28_7) (uninstall error)
! devel/boost-libs (boost-libs-1.72.0_2) (uninstall error)
! devel/cmake (cmake-3.18.3) (uninstall error)
所以又是“卸载错误”。
处理这个问题的正确方法是什么?
更新:看来 Portupgrade 是罪魁祸首。它做与 Portmaster 配合良好。即:
env BATCH=yes portmaster -afGyd --no-confirm
我花了一段时间才弄清楚如何说服这个工具不要让我忙着每隔一分钟按“y”和“Enter”,但随后它通过“安装”、“重新安装”来完成我的所有软件包,或“升级”。没有错误。
然后我portupgrade -af --batch
又尝试了一次,结果再次出现“卸载错误”。
一旦我通过另一次运行确认了这一点,我会将其写为答案。
更新2:另一次使用 Portmaster 运行时,一些软件包出现了“卸载错误”。之后的另一天再次尝试portsnap auto
,Portmaster 很好地处理了我的所有包裹。所以问题来了又去。我现在放弃了。由于上次完整运行 Portmaster 是成功的,我就到此为止。我安装了每日 cron 作业:
#!/bin/sh
set -e
portsnap auto
env BATCH=yes portmaster -aGyd --no-confirm
env BATCH=yes portmaster -ys --no-confirm
service -R
echo "All done!"
希望这会很好。
更新3:我将上面的脚本与几个env BATCH=yes portmaster -afGyd --no-confirm
手动脚本交错,这没有产生任何错误,但确实重新安装了我的所有软件包。
总评:从现在开始,我将始终在我的 FreeBSD 安装上使用端口。预编译的软件包pkg
可以正常工作,但是有一天,您需要在一个小软件包中对一个微小的配置进行与预编译版本不同的设置。然后你需要端口。此外,在那一天,您可能没有时间重新学习如何使用操作系统基础架构的重要部分。所以我建议全程使用端口。如果有多台机器,也许可以看看Poudriere(我自己从未尝试过,但也许有一天会尝试)。
答案1
pkg autoremove
不做你认为它做的事。
pkg autoremove 用于删除孤立包,这些包是在依赖关系解析期间安装的并且不再需要的。
您应该做的是pkg delete <pkg>
针对您想要卸载的内容。如果您要使用,则需要执行许多步骤来安装端口make
。
第一步/usr/ports/<pkg>
:
make config fetch checksum depends extract patch configure build
然后删除工作文件或make install
同时删除工作文件和下载的程序。make clean
make distclean
所有这一切都假设您已将端口树和软件包保持为最新。
你应该遵循优秀FreeBSD 手册