跳過到頁腳內容
Iron Academy Logo
學習 C#
學習 C#

其他分類

為 C# 開發者更新 Linux 軟體包

Tim Corey
8m 25s

當您在Linux上開發C#應用程式時,您的系統套件影響的不僅僅是作業系統。 用於測試網頁應用程式的瀏覽器引擎、.NET SDK、共用程式庫和安全性修補程式都通過套件管理器提供。 運行過時的套件可能造成構建問題、安全漏洞或與最新.NET功能不相容。

在他的影片"Updating Linux Packages for C# Developers," Tim Corey介紹如何使用圖形更新管理器和命令行來保持Linux安裝的最新狀態,作為他更廣泛的Linux上的C#系列的一部分。 在這篇文章中,我們將探討這兩種方法,深入理解每個命令實際上做了什麼,並解釋為什麼保持系統更新對於.NET開發尤其重要。

Linux套件管理與Windows的不同之處

[0:00 - 0:38] Tim首先討論了從Windows過來的開發者常遇到的一個障礙。 在Windows上,每個應用程式通常自行管理更新。 Visual Studio獨立於Edge檢查更新,Edge的更新與您的印表機驅動程式的更新分開進行。 沒有一個系統可以跟蹤安裝在您電腦上的所有項目。

Linux採用集中化的方法。 如apt(高級套件工具)這樣的套件管理器會跟蹤從官方存儲庫安裝的每個軟體。 當您運行更新時,apt會同時查詢存儲庫中每個安裝的套件。 瀏覽器更新、程式庫補丁、SDK升級和安全修復都通過同一管道提供。

對於C#開發者來說,這具有實際意義。 您的.NET執行環境、您HTTPS調用所依賴的OpenSSL程式庫以及您的應用程式連結的系統級別相依都是由這個系統管理的。 如果您是首次在非Windows平台上開始使用C#,了解套件管理器的運作方式可以讓您避免日後處理神秘的構建失敗。 單一apt upgrade使整個堆疊保持一致,這在Windows上需要通過多個單獨的更新器進行協調。

圖形界面:更新管理器

[0:38 - 1:34] 對於偏好視覺化工作流程的開發者,Tim首先介紹了更新管理器。Linux Mint包括一個類似於Windows更新的工具。 任務欄右下角的圖標會打開它,您能看到將更新哪些項目:Microsoft Edge、Firefox、curl、libssh等。 每個項目都顯示當前版本、新版本及下載大小。

所有套件預設都被選中,但您可以取消選中需要跳過的更新項目。 如果您的專案需要特定版本的工具,而且您不希望在衝刺過程中更換,這樣做就很有用。

您點擊"安裝更新",在系統提示時輸入密碼,然後等待過程完成。 之所以需要密碼提示,是因為修改系統套件是一項管理操作,我們會在下一節中介紹更詳細的內容。

圖形界面的一個優點是:它根據風險級別對更新進行分類,對可能影響系統穩定性的變更更加保守。 對於剛接觸Linux且只想讓其環境保持良好的健康狀態而不需擔心細節的開發者,更新管理器是一個穩妥的預設選擇。

理解sudo

[1:34 - 1:51] 在進入終端前,Tim解釋了sudo,因為它出現在每個命令行包操作中。 在開始輸入前,了解它的作用是值得的。 大多數Windows帳戶默認是管理員帳戶,賦予您完整的權限來安裝、刪除和修改系統軟件。 Linux採用了相反的方法:您的帳戶運行在有限的權限下,只有在需要時向管理員權限升級。

為命令添加sudo前綴會觸發密碼提示以驗證您的身份。 身份驗證後,該命令以根權限執行,然後權限返回正常。 套件管理(安裝、刪除或更新軟體)是一項系統級別操作,可能影響到機器上的每個應用程式,因此明確的sudo前綴可以確保您不會在打算執行其他操作時意外修改系統套件。

如果您曾使用過Windows,可以將其視為類似於以管理員身份運行Visual Studio,不同的是在Linux上您針對單個命令提升權限,而不是整個應用程式。 這是一種更加精確的模式。

命令行:apt update

[1:51 - 2:28] 探討sudo之後,Tim轉到了終端。 在那裡工作可以讓您更細緻地控制更新過程,並且他依次走過三個命令。 弄清每個命令的作用是重要的,因為正如他所指出的,名稱具有欺騙性。

第一個命令是:

sudo apt update
sudo apt update
SHELL

一種常見的假設是這個命令更新套件。 但事實並非如此。 apt update會刷新套件索引,這是一個本地可用軟體的目錄。 隨著時間的推移,隨著維護者發布新版本,這個目錄會過時,因此運行此命令將從存儲庫伺服器下載最新版本。 您的機器上沒有任何軟體改變。這純粹是信息收集步驟。

運行它之後,apt報告多少套件有新版本可用。 您可以在做出任何更改之前檢查完整列表:

apt list --upgradeable
apt list --upgradeable
SHELL

這讓您看到每個有新版本可用的套件的逐行視圖,包括當前和新版本號。 如果您在這台機器上使用.NET,這裡可能會看到SDK更新、運行時補丁或應用程式所依賴程式庫的變更。 了解哪些.NET版本在運行在您的機器上,幫助您決定某個升級是否安全應用或需要先進行測試。

命令行:apt upgrade

[3:01 - 3:40] 一旦索引刷新,Tim轉到了第二個真正安裝新版本的命令:

sudo apt upgrade
sudo apt upgrade
SHELL

注意命名:upgrade是改變套件的命令。 這個二步拆分是有意的。 它將"查看可用內容"步驟與"應用更改"步驟分開,給您時間審查、研究或備份,然後再進行任何操作。

在引擎蓋下,upgrade遵循嚴格的規則,關於它會和不會做的事情。 它會下載並安裝您系統上已經存在的套件的新版本,但不會刪除現有套件或安裝之前不存在的新套件。 當新版本需要安裝的相依不存在時,upgrade會阻止該套件,而不是自動引入新的相依。

好處是可預測性。 保持您的.NET堆疊最新版很重要,但以受控方式進行這一點同樣重要。 系統會提示您更改的摘要,並要求進一步行才能繼續,確保沒有您的明確許可不會發生任何事情。

命令行:apt full-upgrade

[3:40 - 4:19] 在應用安全更新後,Tim引入了第三個命令來處理所有upgrade有意保留的內容:

sudo apt full-upgrade
sudo apt full-upgrade
SHELL

upgrade故意避免的情況。 如果套件更新需要安裝新相依或刪除衝突的套件,full-upgrade會執行該操作。 內核升級、主要系統程式庫更改和操作系統級別的補丁都在這裡應用。

將其作為單獨步驟運行為您提供了分層的方法。 如果在複雜的相依解析過程中出現問題,您已經應用了簡單的更新,只需要對更麻煩的問題進行故障排除。

對於管理在Linux上編譯C#應用程式的構建管道的團隊來說,這種分階段的工作流程尤其相關。 在自動化CI/CD環境中,您可能會選擇僅運行full-upgrade保留給計劃的維護窗口,在那裡您可以驗證一切在更深入的系統更改後仍然能編譯和通過。

為什麼套件數量不同

[2:28 - 3:01] 一件經常讓人困惑的事是:更新管理器可能顯示23個更新,而命令行顯示79個套件。 這些不是不同的更新集合; 而是同一系統不同的計算方式。

GUI將相關套件分組成邏輯單位。 更新管理器中的單個"Firefox更新"實際上可能由Firefox二進位、其本地化包、它依賴的共用程式庫以及配置套件組成,每個都由apt作為單獨的套件跟蹤。 因此,更新管理器顯示為一個更新的項目,apt列為四個或五個單獨的套件升級。

一旦您知道這一點,差異就不再令人困惑。 有人可能會說"我有100個套件需要升級",與您的更新管理器顯示為30個更新的同一組變更。

Flatpak:一個獨立的套件管理器

[5:56 - 6:41] 有一個不易察覺的陷阱:Linux可以安裝多個套件管理器,而apt只知道它管理的套件。 Flatpak就是其中一個替代方案;它是一個基於沙盒的系統,將應用程式及其相依封裝在一起,隔離它們與系統的其他部分。

如果您通過Flatpak安裝了軟體,運行apt upgrade不會影響這些應用程式。 您需要單獨更新它們:

flatpak list
flatpak update
flatpak list
flatpak update
SHELL

flatpak update則將這些套件更新到最新版本。 定期檢查是個好習慣,尤其是在您通過它安裝了IDE、資料庫工具或通信應用程式時。

在Linux上,軟體可以通過apt、Flatpak、Snap甚至手動安裝。 每個都有自己的更新機制,因此全面的更新例程應考慮到所有這些。 如果您習慣於每個應用程式附帶自己的更新器,這裡的關鍵區別是您需要知道哪個套件管理器擁有哪個軟件,並為每個套件運行正確的更新命令。

您應該使用哪種方法?

[4:19 - 5:32] Tim的看法是兩種方法都是有效的,正確的選擇取決於您的工作流程。 如果您對可視介面更熟悉,更新管理器通過點擊介面處理apt同樣的更新。 您不需要記住命令或擔心步驟的順序。 但這樣說,有一個理由讓您對命令行更加熟悉:自動化。 您可以創建一個簡單的Shell腳本來運行完整的更新序列,並使用cron安排它每週執行。 一個三行腳本保持您的系統更新,無需您操心,這是一種小的投資,隨著時間的推移會增值。

除了自動化,命令行還允許您根據情境選擇性地應用某些升級等級,或將輸出管道到其他工具進行分析。 這些選項在GUI中不可用。

審計您安裝的套件

[7:16 - 7:54] 更新過程還有一個有用的副作用:檢查您的更新列表時,同時相當於對系統上安裝的內容進行了一次審計。 當您在更新隊列中看到一個套件時,值得問您是否仍然需要它。

您可能在更新列表中看到了Firefox而您主要使用Edge,或者反過來。 為跨瀏覽器測試網頁應用程式安裝兩個瀏覽器是有道理的,但更廣泛的原則是更新列表揭示了您開發環境的完整足跡。 以前項目中遺留下的陳舊工具、作為相依關係引入卻從未清理的開發程式庫、您六個月前忘記安裝的套件:它們都會顯示在這裡。

這類的內務管理比您預期的要有用。 一個乾淨的開發環境更容易在團隊成員之間復製,更容易容器化,也較不容易出現"在我機器上可行"的錯誤。 如果您的Linux設備安裝了您Dockerfile不包含的套件,您可能依賴於生產環境中不存在的某項元件。 熟悉將C#應用程式部署到Docker,能讓您更加具體地了解本地套件與生產環境之間的這種聯系。

結論

[7:54 - 8:25] 正如Tim演示的,整個過程——無論通過更新管理器還是命令行——最多只需要幾分鐘,就可以防止您在操作系統級別上積累技術債。 養成每周例行,代替偶爾的家務,保持您的開發工具、運行時相依性和系統程式庫一致,這種一致性使跨平台C#開發變得可靠而不再令人沮喪。

欲了解完整的逐步操作,請參閱Tim Corey在他的YouTube頻道上的視頻

Hero Worlddot related to 為 C# 開發者更新 Linux 軟體包
Hero Affiliate related to 為 C# 開發者更新 Linux 軟體包

通過分享您所愛的東西賺得更多

您是否在為使用.NET、C#、Java、Python或Node.js的開發者創建內容?將您的專業知識轉化為額外收入!

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我