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

时间:2019-07-01 16:52:37

标签: sdk package nuget project target

Visual Studio 2019,.Net Standard 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>

在安装Nuget程序包后,检查使用者的<***>。csproj.nuget.g.targets文件是否缺少此自定义目标的导入项目标签

1 个答案:

答案 0 :(得分:1)

根据文档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文件打开,查看“错误”,然后调整项目并重试。

仅供参考,您完全不需要使用nuspec,可以使用MSBuild PackagePath metadata on items来指定MSBuild项目的打包位置。我不清楚您的PublishAll目标的目的是什么。如果在尝试包含目标文件时添加了它,则可以将其删除。