Project SDK (.Net Standard):创建包含 msbuild 目标的 nuget 包的官方方式

Project SDK (.Net Standard): Official way to create a nuget package that includes msbuild targets

Visual Studio 2019,.Net 标准 2.0

如何为消费项目包含自定义 msbuild 目标文件? 官方支持的方法是什么?

我已经试过了:

Nuspec:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>TestingNugetContent</id>
    <version>1.0.10</version>
    <title>Blah</title>
    <authors>Me</authors>
    <owners>Me</owners>
    <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
    <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
    <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Blah</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2019</copyright>
    <tags>Tag1 Tag2</tags>
  </metadata>
  <files>
    <file src="Immutable\*.*" target="content/Immutable/" />
    <file src="Build\*.*" target="build/netstandard2.0/" />
  </files>
</package>
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup>
    <NoPackageAnalysis>true</NoPackageAnalysis>
    <NuspecFile>TestingNugetContent.nuspec</NuspecFile>
    <IntermediatePackDir>$(MSBuildProjectDirectory)/bin/$(Configuration)/publish/</IntermediatePackDir>
    <PublishDir>$(IntermediatePackDir)$(TargetFramework)/</PublishDir>
    <NuspecProperties>publishDir=$([MSBuild]::NormalizeDirectory($(IntermediatePackDir)))</NuspecProperties>
    <Version>1.0.10</Version>
  </PropertyGroup>

  <ItemGroup>
    <Compile Remove="build\**" />
    <EmbeddedResource Remove="build\**" />
    <None Remove="build\**" />
  </ItemGroup>

  <ItemGroup>
    <None Include="build\netstandard2.0\TestingNugetContent.targets" />
  </ItemGroup>

  <Target Name="PublishAll" BeforeTargets="GenerateNuspec">
    <ItemGroup>
      <_TargetFramework Include="$(TargetFrameworks)" />
    </ItemGroup>
    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=%(_TargetFramework.Identity)" />
  </Target>


</Project>

正在检查消费者的 <***>.csproj.nuget.g.targets 文件,安装 Nuget 包后缺少此自定义目标的导入项目标签

根据文档,the props and targets file names must match the package id exactly。您的 nuspec<id> 列为 TestingNugetContent,因此文件必须是 TestingNugetContent.propsTestingNugetContent.targets。它们应该直接位于包中的 build/ 文件夹中,或者位于 build/<tfm>/ 文件夹中(我希望更明确,所以我感谢您使用了 netstandard2.0 TFM)。现在,您的 csproj 似乎指定了一个看起来正确的 build\netstandard2.0\TestingNugetContent.targets,所以我只能猜测它没有以某种方式打包到正确的位置。

我目前没有时间展示如何打包的示例,但您可以使用 NuGet package explorer 检查 nupkg 的内容,或者直接将其打开为 zip文件,查看内容 "wrong",然后调整您的项目并重试。

仅供参考,您根本不需要使用 nuspec,您可以使用 MSBuild PackagePath metadata on items 指定打包 MSBuild 项目的位置。我不清楚您的 PublishAll 目标的目的是什么。如果您将其添加为尝试包含目标文件的一部分,则可以将其删除。