vcpkg 概觀
vcpkg 是免費且開放原始碼的 C/C++ 套件管理員,由 Microsoft 和在 Windows、macOS 和 Linux 上執行的C++社群所維護。 它是C++工具,並使用 C++ 和 CMake 腳本撰寫。 其設計目的是要解決管理 C/C++連結庫的獨特痛點。
為什麼要使用 vcpkg?
- 超過 2300 個開放原始碼連結庫 可供選擇,並定期建置以驗證 ABI 相容性
- 使用您自己的自訂連結庫套件建立您自己的自訂連結庫登錄
- Windows、macOS 和 Linux 的一致、跨平台體驗
- 使用 任何建置和項目系統輕鬆地將連結庫新增至您的專案
- 從來源建置相依性或下載預先建置的 ABI 驗證二進位檔,依預設會提供超過 70 個組態,並 針對您的特定需求進行無限自定義
- 使用唯一 的版本設定設計,防止相依性之間的版本衝突和菱形問題
- 針對 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 安裝和使用套件
- 在 Visual Studio 中搭配 CMake 安裝和使用套件
- 在 Visual Studio 中搭配 MSBuild 安裝和使用套件
- 在 Visual Studio Code 中搭配 CMake 安裝和使用套件
- 使用 vcpkg 封裝連結庫
- 將埠新增至 vcpkg 策展登錄
如果您的組建系統不是 CMake 或 MSBuild,vcpkg 也支援 手動整合 您慣用的環境。