# 软件包管理技巧

## 如何挑选合适的deepin 软件包

你可以根据 aptitude 这个包管理工具中的软件包描述或者是任务面板下的列表信息，来查找你所需要的软件包。

当遇到2个以上的类似的软件包时，先前没有经过反复的尝试，你不知道安装哪一个的时候，应该用常识来判断。我认为以下几点是首选的软件包应该具有的特征。

重要性：是 > 否

类型：main > contrib > non-free

优先级：需要 > 重要 > 标准 > 可选 > 额外

任务：在任务下有软件包的列表信息，例如 “桌面环境”

软件包是被与之有依赖关系的软件包所选择的（例如 gcc 依赖 gcc-10）

更新日志：维护者经常的更新（可以在deepin-community仓库中查看）

## 混合源档案库中的软件包

::: warning 小心
从混合源档案库中安装软件包是不被 deepin 官方发行版所支持的，除了一些特殊情况，比如某个软件的安装方式指定需要你添加软件源
:::

这种情况下建议备份原有软件源

```Shell
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
```

然后再更改软件源

::: warning 小心
当使用混合档案源的时候，因为deepin不会确保软件之间的兼容性，所以你必须自己去解决兼容性问题。如果软件之间存在不兼容性，系统可能会损坏。你必须能够判断这些操作所需的技术要求。使用任意混合的档案源是完全可选的操作，我并不鼓励你去使用它。
:::

从不同的档案库中安装软件包的一般规则如下。

- 非二进制软件包 ("Architecture: all") 的安装是更保险的。
  - 文档软件包：没有特别的要求
  - 解释程序的软件包：兼容的解释器必须是可用的
- 二进制软件包 (non "Architecture: all")通常会面临很多障碍，它的安装不保险的。
  - 库文件版本的兼容性（包括 "libc"）
  - 与之相关的有用的程序版本的兼容性
  - 内核 ABI 的兼容性
  - C++ ABI 的兼容性
  - …

::: tip 注意
为了使软件包的安装变得更保险 ，一些商业的非自由的二进制程序包可能会提供完整的静态链接库。你还是应该检查 ABI 的兼容性问题等等。
:::

::: tip 注意
为避免短期出现坏的软件包，从非官方支持的档案库安装二进制软件包通常是一个坏注意。即使你在使用 apt-pinning 情况下，也是这样的。(参见 第 2.7.3 节 “调整候选版本”).你应当考虑使用 chroot 或类似技术(参见 第 9.11 节 “虚拟化系统”)来运行不同档案库的程序。
:::

## 调整候选版本

::: danger 警告
⚠️新手用 apt-pinning 命令会造成比较大的问题。你必须避免使用这个命令除非确实需要它。
:::

没有 "`/etc/apt/preferences`" 文件，APT 系统使用版本字符串来选择最新的可用版本作为 候选版本。这是通常的状态，也是 APT 系统最推荐的使用方法。所有官方支持的档案库集合，并不要求 "`/etc/apt/preferences`" 文件，因此，一些不应当被作为自动更新源的软件包，被标记为 `NotAutomatic`，并被适当处理。

::: tip
版本字符串的比较规则可以被验证，例子如下，"dpkg --compare-versions ver1.1 gt ver1.1~1; echo $?" (参见 dpkg(1))。
:::

如果经常从混合源档案库中安装软件包 (参见第 2.7.2 节 “混合源档案库中的软件包”), 你可以通过创建 "/etc/apt/preferences"
文件并且在其中写入关于调整候选版本的软件包选取规则的合适条目 (如apt_preferences(5) 中所示)来自动化这些复杂的操作。这被称为 apt-pinning。

::: warning 小心
当使用 apt-pinning 命令时，因为系统不会确保软件之间的兼容性，所以你必须自己确认其兼容性。apt-pinning 是完全可选的操作，我并不建议去使用它。
:::

::: warning 小心
档案库层级的 Release 文件 (参见 第 2.5.3 节 “档案库层的“Release”文件”) 使用 apt_preferences(5) 的规则.对于 Debian 通用档案库 和 Debian 安全档案库，apt-pinning 只在 "suite" 名下工作。(这点和 Ubuntu 档案库不同.)例如，你在 "/etc/apt/preferences" 文件里面，可以使用"Pin: release a=unstable" ，但不能使用 "Pin: release a=sid".
:::

::: warning 小心
当使用非 deepin 的档案库作为 apt-pinning 的一部分时，你应该检查它们的用途和可信度。例如，Ubuntu 和 deepin 是不能混在一起的。
:::

::: tip 注意
即使不创建 "/etc/apt/preferences" 文件，在不用 apt-pinning 命令的情况下，你也可以进行相当复杂的系统工作 (参见第 2.6.6 节 “使用 dpkg 命令进行救援”和第 2.7.2 节 “混合源档案库中的软件包”)。
:::

如下是关于 apt-pinning 技术的简化说明。

可用的软件包源在 "/etc/apt/sources.list" 文件里面定义，APT 系统从可用的软件包源里面选择 Pin-Priority 值最大的，作为升级 软件包的候选版本。如果一个软件包的 Pin-Priority 大于 1000，这个版本限制为只能 升级，关闭了软件包降级功能（参见 第 2.7.10 节 “紧急降级”）。

每个软件包的 Pin-Priority 值是在 "/etc/apt/preferences" 文件中的 "Pin-Priority" 条目中定义或者是使用它的默认值。
| **Pin-Priority** | **apt-pinning 对软件包的影响**                        |
|:----------------:|:----------------------------------------------:|
| 1001             | 安装该软件包，即使是一个降级软件包的指令                           |
| 990              | 用作目标发行版档案库的默认值                                 |
| 500              | 用作常规档案库的默认值                                    |
| 100              | 用于 NotAutomatic 和 ButAutomaticUpgrades 档案库的默认值 |
| 100              | 用于已安装软件包                                       |
| 1                | 用于 NotAutomatic 档案库的默认值                        |
| -1               | 即使被推荐，也绝不安装这个软件包                               |

目标发行版档案库可以通过以下几种方法来设置。

- "/etc/apt/apt.conf" 配置文件中写入 "APT::Default-Release "stable";"

- 命令行选项，例如: "apt-get install -t testing some-package"

NotAutomatic 和 ButAutomaticUpgrades 的档案是由档案库服务器上档案层级的 Release 文件来设置，(参见 第 2.5.3 节 “档案库层的“Release”文件”)，
同时包含"`NotAutomatic: yes`" 和 "`ButAutomaticUpgrades: yes`".而 NotAutomatic
档案也是由档案库服务器上的档案层级的 Release 文件来设置，但只包含 "`NotAutomatic: yes`".

来自多个档案源的软件包的 apt-pinning 情况可以通过 "apt-cache policy package" 命令显示。

- "Package pin:" 开头的行，列出了软件包版本的 pin ，如果 package 相关的 pin 已经定义, 例如, "Package pin: 0.190".

- 没有 "Package pin:" 的行存在，如果没有 package 相关的定义。

- 与 package 相关的 Pin-Priority 值列在所有版本字符串的右边，比如，"0.181 700".

- "0" 是列在所有版本字符串的右边，如果没有 package 相关的定义。例如, "0.181 0".

- 档案库 (在 "/etc/apt/preferences" 文件作为"Package: *"定义) 的 Pin-Priority 值，列在所有档案库路径的左边，
    例如，"100 <http://deb.debian.org/debian/> bullseye-backports/main Packages".

## 更新和向后移植

::: warning 注意
deepin 不建议使用换源的方式进行大版本的更新，因为这样会导致系统的不稳定，建议使用 deepin 官方提供的升级工具进行升级。
或者按照后续补充文档教程进行更新
:::

## 阻止推荐的软件包的安装

::: danger 警告
⚠️新手用 apt-pinning 命令会造成比较大的问题。你必须避免使用这个命令除非确实需要它。
:::

如果不想要引入推荐的特定软件包，你必须创建 "`/etc/apt/preferences`" 文件并且像如下所示的那样在文件的顶部明确列出这些软件包。

```
Package: package-1
Pin: version *
Pin-Priority: -1

Package: package-2
Pin: version *
Pin-Priority: -1
```

## 使用testing档案库

deepin使用testing档案库的方法如下：
控制中心申请加入内测。然后更新你的软件包即可
::: warning 注意
申请加入内测之后，你的系统会自动更新到最新的内测版本，可能会有一些不稳定的情况，不要在生产环境中使用。
内测更新后，不支持降级到稳定版本，如果你想要降级到稳定版本，可以使用备份还原的方式，或者退出内测后等待稳定版本发布。
:::

## 自动下载和升级软件包

::: danger 警告
⚠️新手用 apt-pinning 命令会造成比较大的问题。你必须避免使用这个命令除非确实需要它。
:::

apt 软件包有自己的 cron 脚本 “`/etc/cron.daily/apt`” ，它支持自动下载软件包。可以安装 unattended-upgrades 软件包来增强这个脚本，使它能够自动升级软件包。可以通过 “`/etc/apt/apt.conf.d/02backup`” 和 “`/etc/apt/apt.conf.d/50unattended-upgrades`” 中的参数来进行自定义，相关说明位于 “`/usr/share/doc/unattended-upgrades/README`” 中。

unattended-upgrades 软件包主要用于 stable 系统的安全更新。如果自动升级损坏 stable 系统的风险小于被入侵者利用已被安全更新修复的安全漏洞，你应该考虑使用自动更新，配置参数如下。

```
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";
```

如果你运行的是 unstable 系统，你应该不会想要使用自动更新，因为它肯定会在某天损坏系统。即使位于这样的 unstable 情况下，你可能依旧想提前下载软件包以节省交互式升级的时间，其配置参数如下。

```
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "0";
```

## 限制 APT 的下载带宽

如果你想限制 APT 的下载带宽到 800Kib/sec（=100KiB/sec），你应该像下面那样设置 APT 的配置参数。

```
APT::Acquire::http::Dl-Limit "800";
```

## 上传软件包的是谁？

尽管 “/var/lib/dpkg/available” 和 “/usr/share/doc/package_name/changelog” 中列出的维护者姓名提供了关于“软件包运作的幕后者是谁”这一问题的一些信息，
但软件包的实际上传者依旧不明。devscripts 软件包中的 who-uploads(1) 可以识别 deepin 源软件包的实际上传者。
也可以去deepin-community 的github仓库查看。
