跳至內容
GitHub 儲存庫 論壇 RSS 新聞提要

公告新的 apt 和 rpm 軟體庫

Brian J. Cardiff

更新:截至 2021-05-01,bintray 軟體庫已不再可用。發佈的套件現在託管在 Open Build Service 上,請參閱最近的部落格文章

我們一直在努力改進官方 deb 和 rpm 軟體庫的技術水平。

主要的成果是,我們將能夠

  • 發佈穩定版、不穩定版和每日建置的套件
  • 允許使用者選擇要安裝的 Crystal 版本
  • 允許在需要時調整相依性(例如:CentOS 6 與其他發行版在 libevent2-devel 和 libevent-devel 上的差異)
  • 引入一個單一安裝腳本,目前可與 deb/rpm 搭配使用

這將允許

  • 為終端使用者提供更舒適的體驗
  • 依靠 apt 和 rpm 軟體庫不僅能取得最新的 Crystal 版本
  • 在不需要 Docker 或 Snap 的情況下測試每日建置的套件
  • 如果我們的 Docker 映像檔不夠適合,可簡化在其他 CI 系統中的採用
  • 取得版本採用的統計資料
  • 最終將目前套件拆分為編譯器、shards 和可能的工具

我們將在 https://bintray.com/crystal 上託管這些套件

dist.crystal-lang.org 中的目前 apt 和 rpm 套件將繼續可用,並在 2020 年 11 月之前接收穩定更新,作為過渡期。

安裝腳本允許預設安裝最新的穩定版本

$ curl -fsSL https://crystal.dev.org.tw/install.sh -o install.sh
$ chmod +x install.sh
$ sudo ./install.sh

# Or, to run it directly
$ curl -fsSL https://crystal.dev.org.tw/install.sh | sudo bash

# Or, if you prefer wget
$ sudo bash -c "$(wget -O - https://crystal.dev.org.tw/install.sh)"

選擇管道,例如選擇每日建置的套件

$ sudo ./install.sh --channel=nightly

# Or, to run it directly
$ curl -fsSL https://crystal.dev.org.tw/install.sh | sudo bash -s -- --channel=nightly

# Or, if you prefer wget
$ sudo bash -c "$(wget -O - https://crystal.dev.org.tw/install.sh)" -s -- --channel=nightly

安裝特定版本,格式為 major.minor.patchmajor.minormajor.minor.patch-iteration

$ sudo ./install.sh --crystal=0.35

# Or, to run it directly
$ curl -fsSL https://crystal.dev.org.tw/install.sh | sudo bash -s -- --crystal=0.35

# Or, if you prefer wget
$ sudo bash -c "$(wget -O - https://crystal.dev.org.tw/install.sh)" -s -- --crystal=0.35

一般而言,安裝腳本會接受選擇性引數

  • --crystal,值為 major.minor.patchmajor.minormajor.minor.patch-iteration
  • --channel,值為 stableunstablenightly

它會識別 Linux 發行版,並使用 yumapt

安裝腳本需要 gnupgca-certificatesapt-transport-https 套件,這些套件可能已在您的設定中可用。它也需要以 root 身分執行。

如果我已經透過 apt/rpm 安裝了 crystal 該怎麼辦?

安裝腳本會在每次執行時覆寫 /etc/apt/sources.list.d/crystal.list/etc/yum.repos.d/crystal.repo。這些是先前官方 apt 和 rpm 軟體庫中使用的相同檔案。

如果您已經有最新版本的 Crystal (0.35.1) 並執行安裝腳本,您會看到

# Debian/Ubuntu
... stripped ...
crystal is already the newest version (0.35.1-1).
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

# CentOS/Fedora
... stripped ...
Package crystal-0.35.1-1.x86_64 already installed and latest version
Nothing to do

當新軟體庫中沒有更新的版本時,就會發生這種情況。如果您切換至每日建置的管道,您將會取得 1.0.0-dev。

您可以執行 apt -y remove crystalrpm -e crystal 以移除目前安裝的 Crystal,然後執行安裝腳本。

注意事項

安裝腳本會升級至較新的 Crystal,但不會降級。

如果您已經有 0.35.1,並希望降級至最新的 0.34,您會取得以下輸出。

$ ./install.sh --crystal=0.34

# Debian/Ubuntu
... stripped ...
Selected version '0.34.0-1' (Bintray:all [amd64]) for 'crystal'
Suggested packages:
  libxml2-dev libgmp-dev libyaml-dev libreadline-dev
The following packages will be DOWNGRADED:
  crystal
0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 2 not upgraded.
E: Packages were downgraded and -y was used without --allow-downgrades.

# CentOS/Fedora
... stripped ...
Package matching crystal-0.34.0-1.x86_64 already installed. Checking for update.
Nothing to do

我們沒有在安裝腳本中強制降級,而是要求您在降級之前明確解除安裝 Crystal。

# Debian/Ubuntu
$ apt -y remove crystal
$ ./install.sh --crystal=0.34

# CentOS/Fedora
$ rpm -e crystal
$ ./install.sh --crystal=0.34

在不同管道之間切換時,您可能需要清除快取的 metadata。

$ yum clean metadata



接下來將說明這些軟體庫的配置方式,以供文件參考。

deb 軟體庫

deb_distribution=alldeb_component 宣告的 deb 軟體庫用於管道。

deb https://dl.bintray.com/crystal/deb all stable
deb https://dl.bintray.com/crystal/deb all unstable
deb https://dl.bintray.com/crystal/deb all nightly

幸運的是,所有 deb 發行版的相依性都相同,至少目前不需要區分它們。

發佈 amd64 和 i386 的套件。

軟體庫 metadata 會使用 Bintray 共用 GPG 金鑰簽署

$ apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 379CE192D401AB61

穩定版和不穩定版管道中的 deb 套件會使用我們自己的 GPG 金鑰簽署。

每日建置管道中的 deb 套件未簽署。

透過 apt 安裝時,只會檢查軟體庫 metadata 簽章,因此一般不需要新增我們自己的金鑰。

$ curl -sL "https://keybase.io/crystal/pgp_keys.asc" | apt-key add -

rpm 軟體庫

rpm 軟體庫需要稍作微調。軟體庫的網址為 https://dl.bintray.com/crystal/rpm/{DISTRO}/{ARCH}/{CHANNEL}。在 Bintray 組態方面,我們使用 yum_metadata_depth=3

我們將使用兩個 {DISTRO} 值:el6all。目前這已足夠支援 CentOS 6/7/8、Fedora。(注意:如果 CentOS 6/7 隨附 rpm >= 4.13,則使用 libevent-devel >= 2.0 or libevent2-devel 作為相依性,則一個套件就足夠了)。

rpm 唯一支援的 {ARCH}x86_64

{CHANNEL} 則是 stableunstablenightly

與之前一樣,軟體庫 metadata 會使用 Bintray 共用 GPG 金鑰簽署,而套件會使用我們自己的金鑰簽署,每日建置管道除外。

取代 {DISTRO}{CHANNEL},一切就設定好了。

[crystal]
name=Crystal
baseurl=https://dl.bintray.com/crystal/rpm/{DISTRO}/x86_64/{CHANNEL}
gpgcheck=0
repo_gpgcheck=1
gpgkey=http://bintray.com/user/downloadSubjectPublicKey?username=bintray



後續步驟

我們計劃發佈不穩定的 1.0.0-pre1,因此我們需要正式化標記的不穩定版本是如何公告的。1.0.0-pre1 版本將是第一個在不穩定管道中發佈的版本,該管道目前為空。

也有一些關於如何正式化 .tar.gz 在管道中公告的草案想法。

廣告中宣傳的安裝方法將會更新,以反映這些新的儲存庫。

CI 整合也將會更新,並且可能會包含一些新功能,以選擇特定的 Crystal 版本和通道。