Project SDK (.Net Standard): официальный способ создания пакета nuget, включающего цели msbuild - PullRequest
0 голосов
/ 01 июля 2019

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>

Проверка потребителя <***>. csproj.nuget.g.targets файл тег проекта импорта для этой пользовательской цели отсутствует после установки пакета Nuget

1 Ответ

1 голос
/ 01 июля 2019

Согласно документам, имена файлов реквизита и цели должны точно соответствовать идентификатору пакета .Ваш nuspec перечисляет <id> как TestingNugetContent, поэтому файлы должны быть TestingNugetContent.props и TestingNugetContent.targets.Они должны быть либо непосредственно в папке build/ в пакете, либо в папке build/<tfm>/ (я предпочитаю быть более явным, поэтому я ценю, что вы использовали netstandard2.0 TFM).Теперь ваш csproj, кажется, указывает build\netstandard2.0\TestingNugetContent.targets, который выглядит правильно, поэтому я могу только догадываться, что он не был каким-то образом упакован в правильное местоположение.

У меня нет времени показывать примеро том, как его упаковать, но вы можете проверить содержимое вашего nupkg, используя NuGet Package Explorer , или просто открыть его в виде zip-файла, посмотреть, что «не так», затем настроить свой проект и попробоватьснова.

К вашему сведению, вам вообще не нужно использовать nuspec, вы можете использовать метаданные MSBuild PackagePath для элементов , чтобы указать, куда упаковываются элементы MSBuild.Мне неясно, какова цель вашей PublishAll цели.Если вы добавили его как часть попытки включить файл целей, вы можете удалить его.

...