vcpkg 概觀

vcpkg 是 Microsoft 和 C++ 社群所維護的免費開放原始碼 C/C++ 套件管理員。 它於 2016 年推出,可協助開發人員將其專案遷移至較新版本的 Visual Studio。 vcpkg 已演變成 Windows、macOS 和 Linux 上的開發人員所使用的跨平臺工具。 vcpkg 有一個大型的開放原始碼連結庫和企業就緒功能目錄,其設計目的是為了協助您的開發程式,並支援任何建置和項目系統。 vcpkg 是核心的 C++ 工具,並以 C++ 撰寫,並以 CMake 中的腳本撰寫。 它是從頭開始設計,以解決 C/C++ 開發人員體驗的獨特痛點。

為什麼要使用 vcpkg?

  • 超過 2200 個開放原始碼連結庫可供選擇,或自備連結庫
  • Windows、macOS 和 Linux 的一致、跨平台體驗
  • 視需要從來源建置相依性,方塊中有超過 70 個組態,並針對您的特定需求進行無限自定義
  • 避免套件與項目之間的 ABI 不相容
  • 防止相依性圖表中的版本衝突和菱形問題
  • 企業就緒。 許多產業的 C/C++ 開發人員都依賴它,包括:財務、遊戲、內嵌/IoT、半導體、防禦和 Microsoft
  • 針對 MSBuild 和 CMake 使用者:自動與您的組建環境整合,以取得順暢的相依性取得體驗

vcpkg 功能

埠和三胞胎

vcpkg 是產生套件的版本化組建配方。 最常見的套件類型是包含標頭、原始程式碼和二進位檔的 C/C++ 連結庫。

三重項會以單一方便的名稱擷取目標組建環境(cpu、os、編譯程式、運行時間等)。 vcpkg 預設提供超過 70 個三胞胎,但您也可以自行定義。

若要在系統上安裝套件,vcpkg 會執行埠的配方檔案,也就是 CMake 腳本。 腳本可能包含下載原始碼或在您的系統上執行組建的步驟。 在建置期間,vcpkg 會使用三重套件中的資訊,以確保產生的套件符合您想要的組態。

二進位快取

雖然 vcpkg 會視需要從來源建置連結庫,但您可以在二進位快取中備份內建套件。 這可讓其他開發人員計算機或持續整合執行來參考這些預先建置的套件,而不需要每次執行新的組建。 vcpkg 會檢查快取是否已經包含有效的現有套件,以判斷重建是否為必要專案,當它嘗試安裝套件時。

體現

您可以宣告直接相依性,並在指令清單檔案新增選擇性功能或版本條件約束。

版本控制

vcpkg 有處理套件版本的唯一方式。 您的指令清單檔案可以參考預設設定的單一基準版本。 基準可讓您輕鬆、無衝突的相依性管理,並提供完整的重現性。 此外,您仍然可以藉由釘選個別套件版本來擁有更進階的控制。

登錄

登錄是 vcpkg 使用者可以安裝的埠和可用版本的目錄。 vcpkg 預設會提供開放原始碼連結庫的公用登錄。 您也可以為自定義、修補程式或私人連結庫建立自己的登錄。

資產快取

資產快 取可讓 vcpkg 在空中鎖定和離線環境中運作,即使遠端主機關閉或遭到入侵,也可確保商務持續性。 它會使用下載鏡像來上傳和還原資產,例如原始程式碼和建置工具。

vcpkg 與其他套件管理員相比

vcpkg 與 NuGet 比較

NuGet 是 .NET 套件管理員,通常用於 C/C++ 開發,特別是針對包含 .NET 專案的 MSBuild 解決方案。 一般情況下,Microsoft C++ 小組不建議使用 NuGet 進行 C/C++ 開發,因為 NuGet 有幾項限制:

  • 編譯類別。 由於 NuGet 無法即時從來源建置套件,因此必須提供預先建置的二進位檔,以符合所有使用者可能的應用程式二進位介面 (ABI) 限制。 使用者負責正確建置套件。 由於缺少相關的元數據,因此很難區分二進位檔。 這會導致使用者將架構、操作系統和編譯程式資訊放在套件名稱中。 這是不想要的,因為架構、OS 和編譯程式資訊的條件約束無法在套件擷取期間強制執行。
  • 二進位與來源。 NuGet 是從頭開始設計的,可提供相對較小的預先建置二進位檔。 開發人員必須能夠存取原始程式碼,以確保 ABI 相容性、效能、完整性和可偵錯性。
  • 不支援 NuGet PackageReference。 檔案不支援 .vcxproj NuGet PackageReference,而且由於 C++ 和 .NET MSBuild 專案之間的技術和架構差異,未來沒有計劃新增它。 這表示 NuGet C++ 使用者不會受益於使用全域快取和參考簡單 MSBuild 詞彙中具有條件式邏輯存取權的功能。
  • 可轉移的 ABI 追蹤。 vcpkg 會重建受到特定套件變更影響的開放原始碼相依性。 例如,如果針對 Boost 發行新的更新,vcpkg 會重建 Boost 的所有相依性,以及相依於 Boost 的連結庫,以確保它們仍可運作。 在解決建置時間衝突之前,不會合併提取要求以更新 vcpkg 存放庫中的連結庫。

vcpkg 與系統套件管理員的比較

Linux、macOS 和 Windows 有各種不同的系統套件管理員,可用來取得和管理 C/C++ 連結庫。 這些套件管理員通常是管理應用程式的絕佳選擇。 但由於其支援的一般本質,它們通常無法提供特別有利於 C/C++ 開發人員的功能。 雖然您的里程會有所不同,但某些系統套件管理員會提供其中一些功能,但沒有下列所有專案:

  • 可轉散發開發人員資產:vcpkg 可以取得可轉散發開發人員資產,以協助偵錯。
  • 預先建置的套件與從來源建置:vcpkg 可以根據您的自定義需求,從來源建置套件。 不需要處理預先建置、預先編譯的套件,讓他們能夠運作。
  • 全目錄版本控制:vcpkg 可讓您相依於一組相容的套件,而不需要 Micromanage 個別套件版本。 您仍然可以視需要執行這項操作,但預設體驗的設計目的是要容易開始使用。
  • 一個系統上相同連結庫的多個復本:您可以使用 vcpkg 在同一個系統上安裝多個相同相依性復本,而系統套件管理員可能會將一個版本安裝到單一全系統的位置。 當您有多個專案時,視不同版本的連結庫而定,這會使專案複雜化。
  • 目錄大小:因為 vcpkg 是針對 C/C++ 特製化的,所以相較於系統套件管理員,它有非常大的 C/C++ 連結庫目錄,而且會主動維護。 一般而言,您更可能尋找適用於 C++ 開發的實用且最新的連結庫。
  • 跨平臺支援:系統套件管理員提供鎖定至特定系統的套件。 如果您需要以多個作業系統類別為目標,則必須為第二個系統尋找不同的套件管理員。 相反地,vcpkg 是跨平臺套件管理員。 因此,您只需要據以調整目標組建即可。

在某些情況下,系統套件管理員絕對合理:

  • 系統套件管理員通常會做好提供和維護該系統專屬連結庫的良好工作
  • 如果您的取用專案具有簡單的建置組態,預先建置的套件應該可在該系統上現成運作。
  • 如果您不打算進行任何跨平台開發,您將不會遇到系統套件管理員的操作系統相容性問題。

vcpkg 是設計來與系統套件管理員並存運作,因此您可以隨意使用對每個相依性而言最有意義的工具。

開始使用 vcpkg

若要試用 vcpkg,請使用我們的其中一個簡介教學課程:

如果您的組建系統不是 CMake 或 MSBuild,請不要擔心,因為 vcpkg 也支援 手動整合 您慣用的環境。