如何使用我自己的标准软件包版本


10

我遇到了Nautilus的问题,除了下载源代码,进行一些更改并自行编译之外,没有找到其他解决方案。因此,现在我有两个版本的Nautilus,这是来自存储库的正式版本,还有一些改动。我想保留两者。

从应用程序内部启动Nautilus时,告诉应用程序使用我自己的Nautilus编译版本的好方法是什么?(例如,使用firefox打开“下载”文件夹)

我发现了firefox的调用,/usr/bin/nautilus所以我可以用一个指向我自己程序的符号链接代替它。但是,我相信在安装Nautilus更新后,此符号链接将被覆盖。我还能做些什么吗?

debian  apt 

1
加入您的版本/usr/local/bin无效吗?即firefox是否搜索了您$PATH并在中找到了版本/usr/bin,或者它(或您的xdg-open文件)是硬编码的/usr/bin/nautilus?通常可以在/ usr / local中安装自己的版本。
彼得·科德斯

我刚刚尝试过,但没有成功。我不知道Firefox内部做什么,但/usr/bin/nautilus似乎以某种方式进行了硬编码。如果将其删除,尽管我在中有一个指向我自己的nautilus版本的符号链接,但是当我尝试打开“下载”文件夹时,firefox不再执行任何操作/usr/local/bin。我的$PATH变量是/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

如果您感到好奇,可以奔跑strace -f -efile,execve -o firefox_syscalls.txt firefox看看ff在做什么。如果您在日志中搜索nautilus,则可能会看到一些信息。(这会-e过滤系统调用execve和文件打开/关闭/路径名的内容,否则将充斥futexX11并进行套接字读/写)。
彼得·科德斯

Answers:


14

我会修复Nautilus的打包版本,乍一看似乎令人生畏,但很容易-尽管它不能在升级包后生存下来,所以确实需要一些纪律。(有关详细信息,请参阅Wouter的答案。)

您遇到的情况中最简单的方法是添加转移:

sudo dpkg-divert --divert /usr/bin/nautilus.original --rename /usr/bin/nautilus

每当软件包尝试安装它时,它将指示dpkg重命名/usr/bin/nautilus/usr/bin/nautilus.original。然后,您可以添加自己的符号链接,即使Nautilus软件包已升级,它也将保持不变。要删除它,请运行

sudo dpkg-divert --rename --remove /usr/bin/nautilus

您可以对需要以类似方式替换的任何其他文件应用相同的技术,除了某些配置文件在转移时无法正确处理之外。


7

最好的长期解决方案是与Nautilus开发人员联系,并与他们一起开发Nautilus官方代码的补丁程序,这样,一旦Nautilus的更新版本进入您的系统,您就不再需要处理此问题。

假设您已完成此操作,直到该更改滴滴到您的系统中,您仍然需要处理想要使用自己的鹦鹉螺修补版的问题。

最简单的方法是生成一个已经应用了补丁的nautilus软件包,并以不会自动升级的方式进行安装。

在Debian(根据您所使用的问题标签)上,最简单的方法是:

apt-get install devscripts
apt-get build-dep nautilus # note, this also pulls in build-essential
apt-get source nautilus
cd nautilus-*
# apply your patch
dch -i
# Set the version number of the new changelog entry to something like x.y.z-a.local,
# where "x.y.z-a" is the version of the package as it existed prior to your patch,
# add a description of the change after the '*', then save and exit the editor
debuild -uc -us -i && sudo debi --upgrade
echo "nautilus hold" | sudo dpkg --set-selections

这将使用您的补丁程序构建一个新软件包,将其安装,然后将其标记在dpkg中,以使其不再自动更新。

下次发布该软件包的更新版本时,apt会通知您存在更新版本,但该版本已被保留。然后,您需要再次执行上述操作。


apt-mark hold packagename是拿着包裹的现代方式。(我甚至做了我自己dpkg-hold/ dpkg-unhold脚本中dlocate使用apt-mark,而不是dpkg --set-selections他们已经使用多年的方法。这些脚本是过时的,因为易于标记,但我仍然有叫他们其他脚本,并删除它们可能会破坏由其他用户编写的脚本dlocate包)
cas

保留的部分man apt-markThe command is only a wrapper around dpkg --set-selections and the state is therefore maintained by dpkg(1) and not affected by the --file option,所以我认为这是一件小事;-)
Wouter Verhelst
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.