在 Ubuntu 中使用 _Reprepro_ 工具在 Sourceforge.net 创建一个 _.deb 软件包存储库_
作为软件开发人员,您可能需要将软件分发给不同的用户。在 Ubuntu 中分发软件的常见方法之一是创建 Debian 软件包 (.deb) 并将其上传到软件包存储库。软件包存储库是托管在服务器上的 Debian 软件包的集合,可用于在 Ubuntu 计算机上安装和更新软件。在本文中,我们将向您展示如何使用 Reprepro 工具创建 .deb 包存储库并将其托管在 SourceForge.net 上。
先决条件
Ubuntu 18.04 或更高版本
根权限
Ubuntu包管理基础知识
第 1 步:安装 Reprepro
Reprepro 是一个可用于管理包存储库的工具。要在 Ubuntu 上安装 Reprepro,请打开终端并运行以下命令 -
sudo apt-get update
sudo apt-get install reprepro
第 2 步:准备您的包裹
在将包添加到存储库之前,您需要创建它们。要创建包,您需要编写控制文件和规则文件,它们描述包以及如何构建它。创建包后,您可以使用 dpkg-buildpackage 命令构建它。有关如何创建 Debian 软件包的更多信息,请参阅官方 Debian 打包指南。
第三步:创建存储库目录
您需要创建一个目录来存储您的包和存储库信息。在此示例中,我们将创建一个名为“myrepo”的目录。
sudo mkdir /var/www/html/myrepo
cd /var/www/html/myrepo
sudo mkdir -p dists/bionic/main/binary-amd64
第四步:初始化存储库
现在您有了一个存储包的目录,您可以使用以下命令初始化存储库 -
sudo reprepro -Vb . init
这将为存储库创建必要的文件和目录。
第 5 步:将包添加到存储库
要将包添加到存储库,请将它们复制到“myrepo”目录并运行以下命令 -
sudo reprepro -Vb . includedeb bionic /path/to/package.deb
将“/path/to/package.deb”替换为包的路径。这会将包添加到存储库中的“bionic”发行版中。
第 6 步:更新存储库
将软件包添加到存储库后,您需要使用以下命令更新它 -
sudo reprepro -Vb . update
这将使用新包更新存储库。
第 7 步:对存储库进行签名
为了确保存储库中的包没有被篡改,您应该使用 GPG 密钥对存储库进行签名。如果您没有 GPG 密钥,可以使用以下命令生成一个 -
gpg --gen-key
要签署存储库,请运行以下命令 -
sudo reprepro -Vb . sign
这将使用您的 GPG 密钥对存储库进行签名。
第 8 步:配置 Apache Web 服务器
要在 SourceForge.net 上托管软件包存储库,您需要配置 Apache Web 服务器。首先,安装 Apache -
sudo apt-get install apache2
接下来,启用必要的模块 -
sudo a2enmod rewrite
sudo a2enmod headers
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_ajp
sudo a2enmod proxy_balancer
sudo a2enmod proxy_connect
sudo a2enmod proxy_html
然后,在 /etc/apache2/sites-available/ 目录中创建虚拟主机配置文件。例如,如果您想在 http://packages.example.com 托管软件包存储库,您可以创建一个名为packages.example.com.conf 的文件,其中包含以下内容 -
sudo nano /etc/apache2/sites-available/packages.example.com.conf
<VirtualHost *:80>
ServerName packages.example.com
DocumentRoot /var/www/html
RewriteEngine on
RewriteRule ^/reprepro(.*) /reprepro$1 [R,L]
</VirtualHost>
此配置文件指定虚拟主机侦听端口 80 并提供 /var/www/html 目录中的文件。 RewriteRule 用于将对 /reprepro URL 路径的请求重写为实际的 reprepro 存储库目录。
通过创建指向已启用站点的目录的符号链接来启用虚拟主机 -
sudo ln -s /etc/apache2/sites-available/packages.example.com.conf /etc/apache2/sites-enabled/
重新启动 Apache Web 服务器以使更改生效 -
sudo systemctl restart apache2
您现在可以通过 http://packages.example.com/reprepro/ 访问包存储库。
第 9 步:将包添加到存储库
现在存储库已设置完毕,您可以开始向其中添加包。下面是如何做到这一点 -
将 .deb 包文件放入传入目录中 -
sudo mv /path/to/package.deb /srv/packages.example.com/reprepro/incoming/
sudo chown reprepro:reprepro /srv/packages.example.com/reprepro/incoming/package.deb
将包导入到存储库中 -
sudo -u reprepro reprepro -Vb /srv/packages.example.com/reprepro includedeb buster /srv/packages.example.com/reprepro/incoming/package.deb
In this example, "buster" is the distribution name, which can be changed to match the name of the distribution you are using.
更新存储库 -
sudo -u reprepro reprepro -Vb /srv/packages.example.com/reprepro update
发布包 -
sudo -u reprepro reprepro -Vb /srv/packages.example.com/reprepro publish
就是这样!您的包现已在包存储库中可用。
步骤 10:更新存储库中的包
如果您需要更新存储库中的包,可以按照以下步骤进行操作 -
将更新的 .deb 包文件放入传入目录中 -
sudo mv /path/to/updated_package.deb /srv/packages.example.com/reprepro/incoming/
sudo chown reprepro:reprepro /srv/packages.example.com/reprepro/incoming/updated_package.deb
将更新的包导入存储库 -
sudo -u reprepro reprepro -Vb /srv/packages.example.com/reprepro includedeb buster /srv/packages.example.com/reprepro/incoming/updated_package.deb
更新存储库 -
sudo -u reprepro reprepro -Vb /srv/packages.example.com/reprepro update
发布更新的包 -
sudo -u reprepro reprepro -Vb /srv/packages.example.com/reprepro publish
就是这样!您更新的包现在可以在包存储库中找到。
第 11 步:从存储库中删除包
如果您需要从存储库中删除包,可以按照以下步骤操作 -
从存储库中删除包 -
sudo -u reprepro reprepro -Vb /srv/packages.example.com/reprepro remove buster package_name
在此示例中,“buster”是发行版名称,可以更改该名称以匹配您正在使用的发行版的名称。 “package_name”是您要删除的包的名称。
更新存储库 -
sudo -u reprepro reprepro -Vb /srv/packages.example.com/reprepro update
发布更改 -
sudo -u reprepro reprepro -Vb /srv/packages.example.com/reprepro publish
就是这样!该包已从存储库中删除。
结论
在本文中,您学习了如何在 Ubuntu 上使用 Reprepro 工具设置 Debian 软件包存储库。您学习了如何创建存储库、向其中添加包、更新包以及从中删除包。您还学习了如何配置 Apache Web 服务器来托管包存储库。有了这些技能,您现在可以设置自己的软件包存储库,以将软件分发给您的客户、同事或更广泛的社区。