公告新的 apt 和 rpm 軟體庫
更新:截至 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.patch
、major.minor
或 major.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.patch
、major.minor
或major.minor.patch-iteration
--channel
,值為stable
、unstable
或nightly
它會識別 Linux 發行版,並使用 yum
或 apt
。
安裝腳本需要 gnupg
、ca-certificates
和 apt-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 crystal
或 rpm -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=all
和 deb_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}
值:el6
和 all
。目前這已足夠支援 CentOS 6/7/8、Fedora。(注意:如果 CentOS 6/7 隨附 rpm >= 4.13,則使用 libevent-devel >= 2.0 or libevent2-devel
作為相依性,則一個套件就足夠了)。
rpm 唯一支援的 {ARCH}
是 x86_64
。
而 {CHANNEL}
則是 stable
、unstable
或 nightly
。
與之前一樣,軟體庫 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 版本和通道。