运CoApp创建NuGet C++静态库包

NuGet是微软开发平台下之管教管理软件,使用其若可充分便于之将片老三方的仓库、框架整合进好的类别遭到,省去了成千上万劳动的布置过程。但是从官文档上来拘禁,貌似NuGet对C++的支持不是生好,并且在此时此刻推荐用CoApp来简化包的构建。

1. 环境要求

  • NuGet 2.5 及以上(较新本子才参加了对C++包的支撑)
  • Windows Vista及以上,PowerShell
    3.0(CoApp使用PS来构建C++本地包)
  • CoApp(简化包的构建过程,安装详见官网)

  • 未雨绸缪材料


  • 静态库及相应发布的头文件
  • 静态库标记数据库(即PDB文件)
  • 文档(可选)

  • 编写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