NuGet是微軟開發平臺下的包管理軟體,使用它你可以非常方便的將一些第三方的庫、框架整合進自己的項目中,省去了不少麻煩的配置過程。但是從官方文檔上來看,貌似NuGet對C++的支持不是很好,並且在現階段推薦使用CoApp來簡化包的構建。 1. 環境要求 NuGet 2.5 及以上(較新版本才加入了對 ...
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: [email protected];
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
。