如何创建 PPA?

如何创建自己的自定义PPA与Ubuntu社区分享?我正在尝试创建自己的自定义软件包集,并且非常希望与社区共享。

相关或相同:http://askubuntu.com/questions/28562/how-do-i-create-a-ppa-for-a-working-program?rq=1 - fossfreedom
也许这个链接对你有帮助:http://packaging.ubuntu.com/html/getting-set-up.html - rubo77
4个回答


8就我个人而言,在我签署行为准则之前,我已经成功激活了我的PPA。 - Sparhawk
2这是最好的答案。你刚刚被告知如何创建PPA。下面的回答(由totti提供)不是PPA,而是一个公共仓库。尽管(可能)能够实现相同的目标,但两者是不同的。他甚至在回答的第一行中说道: "这个问题已经有了一个写得很好、被接受的答案。由于OP想要一个简单的方法来发布他的软件包,我提供了一个简单的技巧。"因为你更喜欢这个简单的技巧,并不意味着它就是最好的答案。 - lbaile200
好的,但是这个回答中的链接都没有真正描述如何从零开始做。这里的所有链接都是为那些已经对这个材料非常熟悉的开发者准备的。 - rubo77
1@rubo77 - “如何创建”这个问题太过宽泛,无法给出具体答案。一切都取决于您想要打包的内容。实际上,上述回答中的每个步骤都可以作为一个独立的问题,并且每个问题都能得到详细的回答。 - fossfreedom
1托蒂的新回答已经很棒了。 - rubo77
我需要为我的软件签名以供ppa使用吗? - Gleb
我只想补充一点,您可以创建脚本从源代码库生成源代码包。这样可以自动化一些过程。请参见:https://help.launchpad.net/Packaging/SourceBuilds - haggai_e
这个答案漏掉了一个步骤——“创建源代码包”。可能是最困难的一步。 - crobar
Debian软件包必须是源代码而不是二进制文件,这通常是一个无法接受的条件。 - Trevor Hickey

如何创建一个.deb文件
这是一个关于如何从给定的示例脚本创建一个基本的.deb文件的教程。在这个教程中,我们首先使用bash创建一个简单的示例程序,它只会显示“HELLO FROM PROGRAM”。然后,我们为该程序创建一个控制文件,以便制作一个Debian安装程序。最后,它们被打包成一个.deb文件。
步骤:
  1. 在bash中创建一个示例程序

    mkdir "$HOME/create_deb/pgmdir"
    gedit "$HOME/create_deb/pgmdir/zenity_hello.sh"
    

    将以下代码粘贴到其中

    #!/bin/bash
    echo 'HELLO FROM PROGRAM' | zenity --text-info 
    
  2. 使程序可执行

    chmod +x "$HOME/create_deb/pgmdir/zenity_hello.sh"
    
  3. 为Debian软件包创建控制文件

    在文件夹DEBIAN内创建名为control的文件

    mkdir "$HOME"/create_deb/DEBIAN
    gedit "$HOME"/create_deb/DEBIAN/control
    

    并粘贴以下详细信息

    Package: hellodeb
    Version: 0.1
    Architecture: all
    Maintainer: totti
    Installed-Size: 6
    Depends: zenity, bash
    Section: testing
    Priority: optional
    Homepage: http://askubuntu.com
    Description: This is my first debian package.
     Guided by Totti Torvalds.
     In Description new line start with a space.
    

    您可以根据需要编辑内容。了解有关此文件格式的更多信息herehere

  4. 创建postinst脚本,在软件包安装后立即执行

    gedit "$HOME"/create_deb/DEBIAN/postinst
    

    然后粘贴

    #!/bin/sh
    set -e
    echo 'Installing program : zenity_hello.sh ......' | zenity --text-info
    

    并使其可执行

    chmod +x "$HOME/create_deb/DEBIAN/postinst"
    
  5. 创建prerm脚本,在软件包删除之前执行

    #!/bin/sh
    set -e
    echo 'Removing program : zenity_hello.sh ......' | zenity --text-info
    

    并使其可执行

    chmod +x "$HOME/create_deb/DEBIAN/prerm"
    
  6. 创建软件包结构并复制程序、数据等。

    创建已安装程序及其数据的结构。在此示例中,我们将文件放在/bin中。

    mkdir -p "$HOME"/create_deb/bin
    cp "$HOME/create_deb/pgmdir/zenity_hello.sh" "$HOME/create_deb/bin/zenity_hello"
    
  7. 构建.deb文件。

    dpkg-deb --build "$HOME"/create_deb .
    

    将自动命名.deb文件与版本、架构等。或您自定义的名称

    dpkg-deb --build "$HOME"/create_deb "$HOME"/create_deb/hellodeb.deb
    

    或者,如果您使用以下命令构建.deb文件

    debuild -k'your GPG key here' -S
    

    然后您可以使用以下命令将其上传到Ubuntu Launchpad

    dput ppa:<lp-username>/<ppa-name> packet-source.changes
    

    here所述(来源:create a .deb Package from scripts or binaries

  8. 安装新创建的.deb软件包。 您可以使用software-center打开它,但可能无法让您安装。因此,我建议使用gdebi

    在2分钟内发布您的代码库

    由于OP希望以简单的方式发布他的软件包,我提供了一个简单的技巧。

    要求:拥有Dropbox(或任何其他服务,例如GitHub)帐户,并具有公共文件夹。

    1. 在你的Public-Dropbox-Folder中创建一个文件夹,将你的*.deb文件放入其中:

      mkdir ~/Dropbox/Public/deb-packages  
      

      或者在其他地方创建该文件夹,并在你的Public文件夹中创建一个符号链接:

      mkdir ~/deb-packages
      cd ~/Dropbox/Public
      ln -s ~/deb-packages/ deb-packages
      
    2. 进入该文件夹并创建一个脚本,在执行时会创建Packages.gz文件,其中包含有关你的deb软件包的所有必要信息。

      创建:

      gedit import.sh  
      

      将以下内容添加到脚本中:

      #!/bin/bash
      dpkg-scanpackages . /dev/null |gzip > Packages.gz
      

      使其可执行:

      chmod  x import.sh
      
    3. 将一些*.deb文件复制到文件夹中。可以是你自己的文件,也可以是其他存储库中没有的文件。然后进入该文件夹并执行我们放置在那里的脚本:

      cd ~/deb-packages/ 
      ./import.sh
      

      这样应该会创建所谓的Packages.gz文件,apt会查找该文件以了解此存储库中位于哪些软件包。


    就是这样

    现在,等待Dropbox同步文件夹并获取Packages.gz的公共URL。它应该看起来像这样:

    http://dl.getdropbox.../Packages.gz
    

    去掉链接末尾的部分,再加上一些文字,你现在可以使用并填充以下行作为sources.list。
    deb http://dl.getdropbox.../deb-packages ./
    

    就是这样,你已经成功运行了自己的deb软件包仓库。它始终在本地同步,但随时随地都可以供任何人使用。
    注意:`dpkg-scanpackages` 可以从 `dpkg-dev` 中获取。 参考资料

3太棒了!这个方法有效:我使用了Github,在那里找到了一个名为releases/的文件夹的原始目录,链接是https://github.com/rubo77/mouse-speed/blob/master/release/mouse-speed.list。 - rubo77
这个描述了一个自托管的PPA,但是我如何构建一个Ubuntu Debian软件包 - rubo77
4如果你在第7步中使用debuild -us -uc -k'你的GPG密钥'来构建.deb文件,那么你可以使用dput ppa:<lp-用户名>/<ppa-名称> 包源.changes将其上传到Launchpad,就像这里描述的一样(来源:从脚本或二进制文件创建.deb包)。 - rubo77
@rubo77,谢谢,我欢迎你在我的回答末尾添加这些信息。 - totti
1好的,我刚刚完成了,并且我还发现,你需要其他参数来阻止Launchpad立即创建.deb文件(只需使用-S):debuild -k'在此处输入你的GPG密钥' -S,因为Launchpad将会创建deb文件(如果没有被拒绝)- 那么-us -uc是用来做什么的呢? - rubo77
debuild -k'在此输入你的GPG密钥' -S 抱怨 debian/rules - Anwar
@rubo77 - 我在文件/etc/apt/sources.list中添加了deb https://github.com/rubo77/mouse-speed/raw/master/release ./,然后运行命令$ sudo apt-get update,但是我遇到了以下错误:W: 无法下载https://github.com/rubo77/mouse-speed/raw/master/release/./Packages HttpError404 - Ren
尝试将此行添加到新文件/etc/apt/sources.list.d/mouse-speed.list中:deb https://github.com/rubo77/mouse-speed/raw/master/release /,然后运行sudo apt-get update - rubo77

你需要一个Launchpad.net账户来创建PPA。只需点击Launchpad上的用户(在左上角点击您的名字)并创建PPA。您可能需要先签署行为准则,并在您的账户中注册一个GPG密钥。

PPAs只是存储库。ppa:// URL只是简单的URL,脚本apt-add-repository将其转换为/etc/apt/sources.list.d/中的deb行文件,使用Launchpad并遵守其要求。(我读过源代码。)
TL:DR:请参见底部。
这只是一种试图获得权力和控制我们这些所谓“愚蠢”、“无助”的用户的尝试,基于一种被称为“简单”的有毒文化,最终源自苹果对待用户的方式,因为史蒂夫·乔布斯是一个病态的控制狂。(来源:那些直接在他手下工作过的人写的书。) 但这是你的电脑,所以他们在这里没有权力。 :)
如果你看一下deb行,它们包含了真正的存储库URL。例如:
deb [arch=amd64 signed-by=/etc/apt/keyrings/maarten-fonville-android-studio-jammy.gpg] https://ppa.launchpadcontent.net/maarten-fonville/android-studio/ubuntu jammy main
如果你打开这个URL,你会看到一个特定的目录结构。这就是所有的“魔法”。 当然,最简单的方法是
在你选择的目录(家庭服务器、本地电脑、个人主页等)中创建你的本地仓库,如果是本地的话,运行一个非常简单的httpd服务器(“Web服务器”)将该目录提供给目标受众(例如你自己、你的家庭成员、朋友)。
然后,任何想要使用你的仓库的人,只需将你的仓库密钥(作为文件)放入他的`/etc/apt/keyrings/`目录,并在他的`/etc/apt/sources.list.d`目录中添加一个文本文件,其中包含与上述相同的`deb`行,但是要包含你的密钥和URL,以及正确的架构和版本代码名称(当然,比如jammy)。
从长远来看,可能更容易只需要一个非常简单的(一行代码?)脚本,可以自动接受任何正常的仓库URL,并创建这些文件,模仿apt-add-repository而无需经过Launchpad的门卫。
这个答案作为之前缺失的链接,说明“ppas”只是带有一点“安全性”的仓库(主要来自于你,而不是为了你,正如人们可能认为的那样),所以...

TL;DR: 正确的问题应该是:如何创建(和添加)一个仓库?

Debian提供了一个完整的指南,教你如何做到这一点:
https://wiki.debian.org/DebianRepository/#Set_up_and_maintain_a_repository
例如使用reprepro

所以你不需要一个launchpad账户,也不需要服从任何主人,也不需要签署行为准则,审查、仇恨和反向歧视。

当然,如果你想与那些更喜欢服从和追随Canonical/Ubuntu/Launchpad的实体共享,他们拒绝相信其他任何东西,除非他们的主人同意认为它对他们安全,那么这就等同于直接与他们的主人打交道。而目前来看,他们要求完全服从。(比如签署那个CoC)……我不会屈服到那么低的程度,所以我不能告诉你如何做到那一点。