Как правильно разместить кросс-платформенное многоцелевое консольное приложение в виде пакета Nuget и использовать его - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу разместить в Nuget основанное на фреймворке межплатформенное консольное приложение , которое затем может быть запущено как фоновый процесс любым потребляющим .dll (библиотекой классов) .NET Full, .NET Standard или.Библиотека классов NET Core, как показано ниже.

enter image description here

Для этого я создал консольный проект в VS 2017 MyConsole , которыйпредназначен как для .NET Core, так и для .Net Full framework

<TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>

Затем сделал этот пакет инструментов Nuget

<PropertyGroup>
    <IncludeBuildOuput>true</IncludeBuildOuput>
    <BuildOutputTargetFolder>tools</BuildOutputTargetFolder>  
</PropertyGroup> 

 <!-- Include target and props in tools -->
 <ItemGroup>
   <None Include="tools\**" Pack="true" PackagePath="tools\" />
 </ItemGroup>

Указал MSBuild опубликовать выходные данные сборки перед генерациейПакет NuGet для соответствующей многоцелевой платформы и включил опубликованные результаты в пакет инструментов, как показано ниже.

<!--TargetsForTfmSpecificBuildOutput-->  
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>
$(TargetsForTfmSpecificBuildOutput);GatherTargetSpecificBuildOutput
</TargetsForTfmSpecificBuildOutput>
</PropertyGroup> 

<Target Name="GatherTargetSpecificBuildOutput">  
   <ItemGroup>
      <BuildOutputInPackage  Include="$(MyConsoleOutputFolder)*.dll"                             
      </BuildOutputInPackage>
    </ItemGroup>
  </Target>

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

После этого я успешно создал пакет инструментов консоли Nuget.

Теперь главное - использовать пакет консоли Nuget.

Для этого мне пришлось установить MyConsole из NuGet в библиотеку потребляющих классов.Я пометил ссылку на пакет как частный ресурс, чтобы мы могли запустить консоль, но он не должен быть подвержен родительским проектам, использующим dll.

<PackageReference Include="MyConsole" Version="2.1.19-alpha">
  <PrivateAssets>all</PrivateAssets>
</PackageReference>

Вопросы:

  1. Это правильный подход или вы рекомендуете какой-нибудь другой лучший подход?

Проблемы, с которыми я сталкиваюсь:

  1. Чтобы сделать это, я добавил PackageReference из MyConsole в мою библиотеку классов потребления (это противоречит ссылкам на консоль в библиотеке).
  2. Если я не добавлю ссылку на пакет MyConsoleу моего потребляющего dll нет возможности определить и загрузить пакет MyConsole из Nuget
  3. . Этот хорошо работает для библиотек .NET Standard и .NET, использующих ядро ​​, и я могузапустить консольное приложение MyConsole в фоновом режиме.Но .NET Full dll запускает консоль , и я вижу окно консоли, но выдает ошибку для зависимой сборки «Не удалось загрузить файл или сборку» (длянапример, NewtonSoft.Json 6.0.0.0)

Я застрял в этой точке, любая помощь будет высоко оценена!

...