Travis

Travis

这里支持的小组件太少,写不下😂,欢迎查看我的个人 blog <blog.lxythan2lxy.cn>

如何將軟體包提交至 AUR

本文永久鏈接 HOWTO: 提交一個軟件包到 AUR | Travis' Blog,歡迎來踩。


最近發現了 gptcommit,一個用 Rust 寫的使用 gpt 生成提交信息的小工具。原理大概是將 git diff 的輸出發給 gpt,讓它生成可以當提交信息的文本,很適合懶人。人類真的是懶到起飛了😂

在 AUR (Arch User Repository) 上有 gptcommit-git 包,但是版本停留在 0.1.16,感覺可能是 PKGBUILD 寫的有點問題導致常常得手動更新版本。
因為 AUR 中也沒有 gptcommit-bin,同時也為了後續方便一鍵 yay -Syu 更新版本,我準備自己打個包上傳,順便也給社區做點微不足道的貢獻 ☺。

首先查找最權威的 Arch Wiki 看看該如何合法的寫一個包並上傳,查閱一下 Arch 打包準則1和 Arch 提交準則2,問問 ChatGPT 參考參考意見。

2023-04-28-20-44-42.png

gptcommit 的作者在 release 中提供了各個平台編譯好的二進制文件,我們只需要下載下來解壓放在 /usr/bin 目錄下就能使用了,很簡單的打包流程。以下就是寫出來的 PKGBUILD 文件,寫好之後,只要使用 makepkg -Acs 命令,就能在當前目錄生成 tarball,再使用 sudo pacman -U <tarball>pkg.tar.zst 就完成安裝了。

# Maintainer: travismtg <[email protected]>

pkgname=gptcommit-bin
pkgver=0.5.8
pkgrel=1
pkgdesc="A git prepare-commit-msg hook for authoring commit messages with GPT-3."
arch=('any')
url='https://github.com/zurawiki/gptcommit'
license=('MIT')
depends=()
conflicts=('gptcommit-git' 'gptcommit')
source=('https://github.com/zurawiki/gptcommit/releases/download/v0.5.8/gptcommit-x86_64-unknown-linux-gnu.tar.gz')
sha256sums=('d0efe345dd4b598a8c06bd9ba7036ae4e148141deb606c64e612e8959273cedc')

package() {
cd "$srcdir"
    mkdir -p "$pkgdir/usr/bin/"
tar zxvf gptcommit-x86_64-unknown-linux-gnu.tar.gz -C "$pkgdir/usr/bin/"
}

驗證可以正常安裝之後,就可以準備上傳的事情了。

  1. 首先註冊一個 AUR 帳號,註冊完之後設置一下 ssh 的公鑰來證明我是我自己。
  2. 然後就可以新建倉庫了,直接使用 git clone ssh://[email protected]/gptcommit-bin.git 創建遠端倉庫(沒錯,直接 clone 就能創建倉庫)
  3. 然後把我剛剛寫好的 PKGBUILD 文件放進去,使用 makepkg --printsrcinfo > .SRCINFO 生成包基本信息文件
  4. git add PKGBUILD .SRCINFO && git commit -m "v0.5.8"
  5. git push --set-upstream origin master 推到遠端

到這裡已經可以看到我發布的包 gptcommit-bin 在網頁上出現了。但是既然做了,幹脆變得再自動化一些,每次有了新版本讓它自己更新吧。每次有了新版本都手動修改版本號,下載地址以及 sha256 資訊感覺也挺累的。

#!/usr/bin/env bash
# Created by travismtg
# Thu Apr 27 11:08:31 PM CST 2023
# usage: ./update.sh /path/to/pkg

DES=$1 # directory that contains the PKGBUILD file
cd $DES

VERSION_URL=`curl -s https://api.github.com/repos/zurawiki/gptcommit/releases/latest |\
    jq -r '.tag_name as $version | .assets[] | select(.name | contains("linux-gnu")) | $version + " " + .browser_download_url'`

VERSION=$(echo $VERSION_URL | cut -d' ' -f1 | sed 's/v//')
CURRENT_VERSION=$(grep 'pkgver=' PKGBUILD | sed 's/pkgver=//')
echo latest version is $VERSION
echo current version is $CURRENT_VERSION

if [[ $VERSION == $CURRENT_VERSION ]]; then
    echo exit
    exit
fi

URL=`echo $VERSION_URL | cut -d' ' -f2`
POSTURL=$(echo $URL | sed 's/\//\\\//g')

TARGET=$(echo $URL | grep -o 'gptcommit-x86.*tar.gz')
wget $URL -O $TARGET
SUM=$(sha256sum $TARGET | cut -f1 -d' ')

sed -i 's/^source=(.*)/source=('"'"$POSTURL"'"')/' PKGBUILD
sed -i 's/^sha256sums=(.*)/sha256sums=('"'"$SUM"'"')/' PKGBUILD
sed -i 's/^pkgver=.*/pkgver='$VERSION'/' PKGBUILD

makepkg --printsrcinfo > .SRCINFO

# commit and push
git add PKGBUILD .SRCINFO
git commit -m "$VERSION"
git push

每次我只需要 ./update.sh /path/to/pkg 就能更新包文件了。把這些文件放在伺服器上,設置一下 crontab 定時每天早上 10 點檢查版本更新,這樣就達到了自動更新 gptcommit 包的目的。

本文到這裡就結束了,過程中我最大的感受是 ChatGPT 真的是太好用了,我只需要問它該怎麼獲取 github 某一倉庫的最新 release,並篩選出 linux 的下載鏈接,它可以很快的替我找到 github api 並且替我寫好jq 的規則。當然,這些東西自己查閱文檔,或者去 Google 一下肯定能搞定,但是 ChatGPT 替我壓縮了知識獲取的時間,能夠個性化的推理出我想要的東西,這個永遠不會厭煩的老師實在是太棒了。


Footnotes#

  1. https://wiki.archlinux.org/title/AUR_submission_guidelines

  2. https://wiki.archlinux.org/title/Arch_package_guidelines

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。