伊恩·傑克遜:如何在 Debian(和 Ubuntu 等)上使用 Rust

https://diziet.dreamwidth.org/18122.html

Ian Jackson: 在 Debian (以及 Ubuntu 等) 使用 Rust 的方法

總結: 不要僅僅使用 apt install rustc cargo。要麼這樣做並確保僅使用你的發行版的 Rust 函式庫(下面繁瑣的配置);或者只是使用 rustup。

不要做顯而易見的事,這通常並非你想要的。

Q. 從網上下載並運行任何程式碼?

選擇 1: 什麼鬼,不,我不想要 curl|bash。

選擇 2: 忍痛使用 curl|bash。

特權分離

天哪,多亂啊。

不要做顯而易見的事,這通常並非你想要的。

Debian 提供了 Rust 編譯器和大量的 Rust 函式庫。

但如果你用 apt install rustc cargo 這樣的方式,你最終會使用 Debian 的編譯器卻直接且未經選擇性地從 crates.io 使用上游的函式庫。

這不是你想要的。基於你的喜好,有大約兩種合理的做法。

Q. 從網上下載並運行任何程式碼?

關鍵問題是這樣的:

你是否樂意直接從數百個上游 Rust 封包維護者那裡下載程式碼並運行呢?

這就是 cargo 的作用之一。Debian 的 cargo 在這方面行為就像上游的一樣。再說一遍:

Debian 的 cargo 和上游的一樣,會不加選擇地從 crates.io 下載程式碼。

因此,如果你以最明顯的方式使用 Debian 的 cargo,那麼你仍然在下載和運行所有那些隨機函式庫。你避免下載的唯一一件事就是 Rust 編譯器本身,但這恰恰是最受仔細維護的部分,也是最不用擔心的。

當你在構建寫成 Rust 的官方 Debian 源代碼包時,即使運行 dpkg-buildpackage,下載會被抑制;但使用普通的 cargo build 將嘗試獲取並使用上游生態系的依賴。(如果你這樣做的話,它很可能因版本不匹配而提前退出,而不會實際下載任何東西。)

選項 1: 什麼鬼,不,我不想要 curl|bash。

好吧,然後你必須限制自己使用 Debian 內可用的函式庫。每個 Debian 發行版都提供了一套經過挑選的函式庫。這可能或許足夠滿足你的需求,可以使用 Debian 的套件編寫許多功能強大的程式。

但是,除非他們的維護者特意打算支持這一點,否則遇到的任何上游 Rust 項目都可能很難工作。(這種情況相當少見,而且 Rust 的工具並不會讓這變得簡單。)

要採取這個方案,需 apt install rustc cargo 並將其放入配置檔,路徑為 $HOME/.cargo/config.toml:

[source.debian-packages]
directory = “/usr/share/cargo/registry”
[source.crates-io]
replace-with = “debian-packages”

這會讓 cargo 從 /usr/share 中查找依賴,而不是從 crates.io 下載它們。你必須透過 apt 安裝 librust-FOO-dev 的套件依賴。

這將允許你使用 Rust 編寫自己的程式,並使用 cargo build 進行構建。

選項 2: 忍痛使用 curl|bash。

如果你想要構建非特定於 Debian Rust 的軟體,你可能需要使用來自 crates.io 而不是 Debian 的套件。

如果你打算這樣做,那與其不使用 rustup 獲取最新的編譯器,倒不如直接使用 rustup。rustup 的安裝可能引起恐懼,但 cargo 將執行同樣的事情,只是更糟糕(因為它信任更多人)且更隱藏。

因此在這種情況下:確實執行 curl|bash 安裝。

希望你嘗試構建的 Rust 項目有發送了一個 Cargo.lock;裡面包含他們上次使用和測試過的所有依賴的哈希值。如果你運行 cargo build –locked,cargo 將只使用那些版本,這應該是安全的。

你可以運行 cargo audit 檢查是否有任何報告的漏洞或問題。但你需要使用 cargo install –locked cargo-audit 進行引導;cargo-audit 是由 RUSTSEC 團隊提供的,他們關心這類事情,因此運行他們的程式(和他們的依賴)應該是安全的。要注意需要 –locked,因為 cargo 的默認行為是錯誤的。

特權分離

這種做法相當令人擔憂。為了我個人使用,我寫了一個特權分離工具,允許我以獨立的用戶運行所有這些上游 Rust 程式碼。

這個工具叫 nailing-cargo。它並不是非常良好的產品或測試過,但至少對我來說能夠使用。你可能想要試試看,或者考慮其他安排。歡迎提交錯誤報告和修補程式。

天哪,多亂啊

確實如此。有很多技術和社交因素在起作用。

cargo 本身在原則和細節上都令人擔憂。我常常對它的維護者的決定感到嚴重失望。不過,更廣泛的 Rust 上游社區大多對此類事情非常認真,並且經常做出明智的選擇。RUSTSEC 就是其中的一個結果。

Debian 針對 Rust 的套件安排在技術上相當混亂:我認為該方案基於基本錯誤的設計原則。不過,Debian 的 Rust 包裝團隊是不斷努力更新的,並且該團隊通常是樂於接受和樂於助人的。

不幸的是,上次我探索可能性時,Debian Rust 團隊並沒有對工作流程作出更根本性的變化(包括,例如,對依賴版本處理的變化)感興趣。對上游 cargo 的重大改進似乎也不太可能;我們只能希望最終會有人成功地取代它。

via Planet Debian

March 22, 2024 at 04:23AM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *