NuGet是微軟開發平台下的包管理軟件,使用它你可以非常方便的將一些第三方的庫、框架整合進自己的項目中,省去了不少麻煩的配置過程。但是從官方文檔上來看,貌似NuGet對C++的支持不是很好,並且在現階段推薦使用CoApp來簡化包的構建。
1. 環境要求
- NuGet 2.5 及以上(較新版本才加入了對C++包的支持)
- Windows Vista及以上,PowerShell 3.0(CoApp使用PS來構建C++本地包)
- CoApp(簡化包的構建過程,安裝詳見官網)
2. 准備材料
- 靜態庫及相應發布的頭文件
- 靜態庫符號數據庫(即PDB文件)
- 文檔(可選)
3. 編寫AutoPackage腳本
這個腳本是用來指導CoApp構建我們的靜態庫包的,一般使用.autopkg作為其擴展名。 該文件由多個節點(Node)組成,節點的寫法相當於C++中的命名空間。
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 ---- v140
- VS2013 ---- v120
- VS2012 ---- v110
- VS2010 ---- v100
3.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。
