【发布时间】:2021-11-23 08:10:15
【问题描述】:
我已阅读 these instructions 以使用 .nuspec 文件为 C++/CLI .vcxproj 项目创建 NuGet 包。但是,我想使用 MSBuild 来创建我的包,而不是使用 .nuspec 文件。我已经看到 these instructions 使用 MSBuild 打包 .NET Framework 项目,但我找不到任何可以对 .vcxproj 文件执行相同操作的东西。
【问题讨论】:
我已阅读 these instructions 以使用 .nuspec 文件为 C++/CLI .vcxproj 项目创建 NuGet 包。但是,我想使用 MSBuild 来创建我的包,而不是使用 .nuspec 文件。我已经看到 these instructions 使用 MSBuild 打包 .NET Framework 项目,但我找不到任何可以对 .vcxproj 文件执行相同操作的东西。
【问题讨论】:
MSBuild 可以将 pack 一个 Visual Studio 项目转换为 NuGet 包,但 only if that project uses PackageReference 代替 packages.config。
在撰写本文时,the Visual Studio UI doesn't allow you to choose PackageReference 代替 packages.config 作为 VCXPROJ 文件的 NuGet 包配置机制。但是,您可以手动编辑 .vcxproj 文件并将其转换为 PackageReference 格式。
默认情况下,.vcxproj 文件不是 SDK 风格的项目(我不知道它们是否可以转换为 SDK 风格的项目)。要从非 SDK 样式的项目构建 NuGet 包,您需要 reference NuGet.Build.Tasks.Pack:
将以下内容添加到您的 .vcxproj(在 Project 元素内):
<ItemGroup>
<PackageReference Include="NuGet.Build.Tasks.Pack">
<Version>5.11.0</Version>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
添加您的项目所依赖的任何其他包。注意<PrivateAssets>all</PrivateAssets> 元素。您需要NuGet.Build.Tasks.Pack 来打包您的项目,但是当其他人尝试安装您的 NuGet 包时,您不希望它作为依赖项。适当调整NuGet.Build.Tasks.Pack 的版本。
如果您的项目引用静态库,您不希望将它们包含为 NuGet 包依赖项。使用PrivateAssets 元素排除它们。即:
<ItemGroup>
<ProjectReference Include="..\vendor\static-lib-build\static-lib\static-lib.vcxproj">
<Project>{8aa99891-3ff7-3fa7-b1b5-131664298a26}</Project>
<PrivateAssets>all</PrivateAssets>
</ProjectReference>
</ItemGroup>
还在Project元素内添加以下内容
<PropertyGroup>
<PackageId>Your.Package.Id</PackageId>
<Authors>Your Name</Authors>
<BuildOutputTargetFolder>lib</BuildOutputTargetFolder>
<PackageDescription>A description of this package.</PackageDescription>
<TargetFramework>net461</TargetFramework>
</PropertyGroup>
TargetFramework 元素中的内容应该 correspond 到 TargetFrameworkVersion 元素中的内容否则在您的项目中。
请注意,我没有介绍如何构建跨平台 NuGet 包。就其本质而言,C++/CLI 项目针对特定的处理器/架构。您可以在 NuGet 包的 runtime 目录中包含适用于多种体系结构的本机库,但我在这里不做介绍。
此行将恢复您的 NuGet 包,构建项目,然后打包:
"c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe" path\to\the_project.vcxproj /p:Platform="Any CPU" /p:ProductVersion=1.0.0.69 /t:Restore;Build /t:pack
更改命令行选项以满足您的需要。如果NuGet.Build.Tasks.Pack 尚未恢复,您可能需要运行此命令两次。
【讨论】: