你好!
今天我想我将开始解释NuGet如何支持在封面下的C/C++包,并研究如何在理论上手动构建一个包而不使用COAPPosiS壳工具。
正如我前面提到的,为NuGuET构建的C/C++包不需要在NuGET本身中进行大量的更改,主要是因为如果我们让包管理器完成了勾结项目所必需的所有复杂工作,那么我们将从现在起一年内仍在执行它。
相反,我们选择在NuGet中添加一个相当简单(并且经常需要)的特性,即将MSBuild项目文件片段导入到消费项目中的功能。以前,一些包的创建者通过包含一个 install.ps1
包中的PowerShell脚本。虽然这类事情可行,但却暴露出一个可怕的问题。 同样,NuGube需要支持实际工作在C++项目类型上,并且需要用一个新的“框架类型”来创建喇叭,它可以代表本地包(简单地称之为本地包)。 native
).
从NuGet 2.5开始,当安装包时,它会检查 /build/<framework>
用于调用 <pkgName>.targets
或 <pkgName>.props
. 如果它找到一个 .props
,它放置一个 <Import>
进入 顶部 项目文件的。 如果它找到一个 .targets
文件,它放置一个 <Import>
进入 底部 项目文件的。 这使得包创建者可以更细粒度地控制何时声明某个内容,以及是否可以在使用项目中重写该内容。
在这一点上,NuGet对如何将包集成到消费项目中的参与已经基本完成。现在由包创建者来设计 .targets
和/或 .props
以这种方式创建的文件使使用它的项目能够有效地使用内容。
最简单的包装
假设我们想创建一个非常简单的包,它只包含一个头文件,没有任何头文件 .lib
没有任何可再发行的文件(即, .dll
文件)。
给一个简单的 mysample.h
文件:
#pragma once #include <stdio.h> /* some simple function */ #define SimpleWriteString( str ) printf( str )
然后我们需要创建 mysample.targets
确保我们添加 include
目录到消费项目中。
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > <ItemDefinitionGroup> <ClCompile> <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)....libativeinclude;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>HAS_MYSAMPLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> </ClCompile> </ItemDefinitionGroup> </Project>
一个非常简单的 mysample.nuspec
文件(nuspec文件是NuGet用来告诉包中的内容的清单文件。有关.nuspec文件格式的更多信息,请参见 nuget.org上的文档 ).
<?xml version="1.0" encoding="utf-8"?> <package> <metadata> <id>MySample</id> <version>1.2.3</version> <authors>Garrett Serack</authors> <owners>CoApp Project, Garrett Serack</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>A sample library.</description> <releaseNotes>First Release of MySample library</releaseNotes> <copyright>Copyright 2013</copyright> <title>MySample Library</title> <summary>A sample library</summary> <tags>native, MySample</tags> </metadata> <files> <file src="MySample.h" target="libativeincludemysample.h" /> <file src="mysample.targets" target="uildativemysample.targets" /> </files> </package>
一旦我们有了这些,仅仅用 NuGet
命令行工具:
c:MySample> nuget pack Attempting to build package from 'MySample.nuspec'. Successfully created package 'C:MySampleMySample.1.2.3.nupkg'
当然,如果所有的库都是如此简单,我们就不需要为C++构建包的特殊工具。
下一次: 我们将深入研究如何将.lib文件连接到链接器,并确保将可再发行的文件复制到输出目录。
也: 万一你错过了,你可能想看看 频道9访谈NuGe/C++ .