NuGet 目前不直接支持开箱即用。您可以关注this GitHub issue 获取更新。
但是,有几种方法可以创建这样的 NuGet 包。
- 使用“Nugetizer 3000”
这是一个新开发的工具,用于从项目构建 NuGet 包,并通过安装 NuGet.Build.Packaging nuget 包来工作。你可以在它的 GitHub wiki 页面上找到一些关于它的文档,但由于它是一个非常新的项目,还没有太多关于它的文档或社区知识(!)(但是开发它的团队非常有帮助,你可以提交 GitHub如果你卡住了问题)。
- 在项目中添加自定义目标(2.0.0 tooling / VS 2017 15.3+):在 csproj 中创建一个项目,其中将包含引用项目的输出 DLL
这种方法非常笨拙,因为它依赖于包目标使用的内部 MSBuild 项。它首先将 <ProjectReference> 标记为不被创建的 nuget 包引用,如下所示:
<ProjectReference Include="..\libA\libA.csproj" PrivateAssets="All"/>
然后你可以将这个添加到项目中以将生成的libA.dll包含在nuget包中:
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);IncludeP2PAssets</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="IncludeP2PAssets">
<ItemGroup>
<BuildOutputInPackage Include="$(OutputPath)\testprivatelib.dll" />
</ItemGroup>
</Target>
请注意,这需要您将所引用项目的所有 <PackageReference> 项添加到您从中生成包的项目中,因为您有效地禁用了传递引用行为,因此生成的包中会丢失它们。
- 创建自定义
.nuspec 文件
在撰写本文时,这可能是最“受支持”的方式,但也是最复杂的方式。 NuGet 允许您通过在项目中设置<NuspecFile> 属性以及允许您传递替换标记以解析@987654334 的<NuspecProperties> 属性来禁用生成的.nuspec 文件的自动生成和文件的自动收集@文件。
这可以通过像这样修改项目文件来实现:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
<NuspecFile>$(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec</NuspecFile>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\LibB\LibB.csproj" />
</ItemGroup>
<Target Name="SetNuspecProperties" BeforeTargets="GenerateNuspec">
<PropertyGroup>
<NuspecProperties>$(NuspecProperties);id=$(AssemblyName)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);config=$(Configuration)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);version=$(PackageVersion)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);description=$(Description)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);authors=$(Authors)</NuspecProperties>
</PropertyGroup>
</Target>
</Project>
这将自动查找与项目同名的.nuspec 文件 (somelib.csproj => somelib.nuspec) 并将一些属性传递给它。这些属性是在目标中创建的,以便能够访问完全解析和默认的属性,例如PackageVersion。
.nuspec 文件可能如下所示:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>$id$</id>
<version>$version$</version>
<authors>$authors$</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<dependencies>
<group targetFramework=".NETStandard1.4">
<dependency id="NETStandard.Library" version="1.6.1" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
<files>
<file src="bin\$config$\netstandard1.4\*.dll" target="lib\netstandard1.4\" />
</files>
</package>
请注意,您必须将所有引用的 NuGet 包作为 <dependency> 元素添加到 .nuspec 文件中,因为这些包不再从项目文件中的 <PackageReference> 项中自动生成。详情请参阅NuSpec Reference。
我最近为此创建了一个example project on GitHub demonstrating the use of a custom .nuspec file。