使用CoApp創建NuGet C++靜態庫包


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官網中的包頁面下。常用的主要有:

  1. ID
  2. 版本(version)
  3. 標題(title)
  4. 作者(authors)
  5. 所有者(owners)
  6. 許可文件地址(licenseUrl)
  7. 項目地址(projectUrl)
  8. 圖標地址(iconUrl)
  9. 概要(summary)
  10. 描述(description)
  11. 標簽(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM