NuGet是微軟開發平臺下的包管理軟體, 使用它你可以非常方便的將一些協力廠商的庫、框架整合進自己的項目中, 省去了不少麻煩的配置過程。 但是從官方文檔上來看, 貌似NuGet對C++的支持不是很好, 並且在現階段推薦使用CoApp來簡化包的構建。
1. 環境要求NuGet 2.5及以上(較新版本才加入了對C++包的支援)Windows Vista及以上, PowerShell 3.0(CoApp使用PS來構建C++本地包)CoApp(簡化包的構建過程, 安裝詳見官網)
2. 準備材料靜態程式庫及相應發佈的標頭檔靜態程式庫符號資料庫(即PDB檔)文檔(可選)
3. 編寫AutoPackage腳本
這個腳本是用來指導CoApp構建我們的靜態程式庫包的, 一般使用.autopkg作為其副檔名。
3.1 nuget節點
這是腳本的父節點, 它包含所有用來生成NuGet包的子節點。
nuget{ }3.2 nuspec子節點
該節點包含要創建包的中繼資料, 我們在這裡指定將要生成的包的描述資訊, 這些資訊會被顯示在NuGet官網中的包頁面下。 常用的主要有:
ID版本(version)標題(title)作者(authors)所有者(owners)許可檔位址(licenseUrl)專案位址(projectUrl)圖示位址(iconUrl)概要(summary)描述(description)標籤(tags)這個節點是nuget的子節點, 中繼資料的具體寫法如下(注意每一項中繼資料後面都要跟一個分號;):
nuspec { id = EasyXPlus; version : 1.0.1; title: EasyXPlus; authors: lgxZJ@outlook.com; projectUrl: "https://github.com/lgxZJ/EasyXPlus"; summary:A simple C++ graphic library for BEGINNERS under windows!; description: "A simple C++ graphic library for BEGINNERS under windows!"; tags: { beta, native, c++ }; }3.3 files子節點
files節點也是nuget的子節點, 用來指定生成包所需要的檔。 對於C++靜態程式庫來說, 我們只需要在files節點中指定三種檔:
1.標頭檔:include : { "headers\*" };我們指定相對目錄headers下的所有檔為發佈的標頭檔。
2.文檔(可選):docs : { "doc\html\* };我們指定相對目錄doc\html下的所有檔為文檔。
3.庫文件、PDB文件:對於這些檔我們需要指定目標平臺、VS版本和開發模式:
[x86, v140, debug] { lib: builds\vs2015\libeasy\Debug\libeasyd.lib; symbols: builds\vs2015\libeasy\Debug\libeasy.pdb; } [x64, v140, release] { ... }這個資料項目格式不同於其他簡單的項, 不需要在末尾跟分號;。
下面是一些VS版本號與對應工具集:
VS2015 ---- v140VS2013 ---- v120VS2012 ---- v110VS2010 ---- v1003.4 targets子節點
我們沒有用到這個節點, 因此簡單的在Defines定義中加上一個值:
targets { Defines += HAS_EASYXPLUS; }至此, 我們的腳本就編寫結束了, 完整的檔見連結。
4. VS2015發佈支援
但是CoApp還沒有正式的版本支持VS2015, 因此我們採用了github上一個workaround, 這個節點需要寫在nuget節點之前:
configurations { Toolset { key : "PlatformToolset"; choices: { v140 }; // Explicitly Not including pivot variants: "WindowsKernelModeDriver8.0", "WindowsApplicationForDrivers8.0", "WindowsUserModeDriver8.0" // We're normalizing out the concept of the v140 platform -- Overloading the $(PlatformToolset) variable for additional pivots was a dumb idea. v140.condition = "( $(PlatformToolset.ToLower.IndexOf('v140')) > -1 Or '$(PlatformToolset.ToLower)' == 'windowskernelmodedriver8.0' Or '$(PlatformToolset.ToLower)' == 'windowsapplicationfordrivers8.0' Or '$(PlatformToolset.ToLower)' == 'windowsusermodedriver8.0' )"; }; }5. 創建C++靜態程式庫包
在PowerShell下運行以下命令構建本地包, 本地包預設在腳本所在目錄下生成:
Write-NuGetPackage .\EasyXPlus.autopkg如果運行時PowerShell提示無法載入模組或者無法載入檔, 可以試著執行set-executionpolicy remotesigned。