Как упаковать продукты из нескольких проектов в один nuget без файла nuspec? - PullRequest
0 голосов
/ 05 декабря 2018

Я использую проекты Sdk для .NET Framework 4.7.2.Структура проекта:

SmokeTests
 |
 +--UITests
 |   |
 |   +--Common
 |
 + NonUITests
     |
     +--Common

, где:

  • проект SmokeTests ссылается как на UITests, так и на NonUITests, используя ProjectReferences
  • UITests и NonUITests ссылаются на Common, используя ProjectReference
  • UITests, NonUITests и Common ссылаются на некоторые пакеты NuGet с использованием PackageReferences
  • проект SmokeTests не имеет исходного кода, но имеет некоторые файлы содержимого.

Я используюпроект SmokeTests как свернутый проект.Когда я его собираю, его каталог bin \ debug \ net472 содержит все двоичные файлы и символы, которые я хочу иметь в пакете nuget, а именно:

  • NuGet-зависимости UITests, NonUITests и Common
  • Библиотеки UITests, NonUITests и Common
  • PDB

SmokeTests csproj выглядит так:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
    <PackageId>SmokeTests</PackageId>
    <NoPackageAnalysis>true</NoPackageAnalysis>
    <IncludeBuildOutput>true</IncludeBuildOutput>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <ContentTargetFolders>content</ContentTargetFolders>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="**\*.ps1" Exclude="PSTests\run.ps1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\NonUITests\NonUITests.csproj" />
    <ProjectReference Include="..\UITests\UITests.csproj" />
  </ItemGroup>

</Project>

У меня также есть каталог.Файл Build.props:

<Project>

  <PropertyGroup>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <AllowedReferenceRelatedFileExtensions>.pdb</AllowedReferenceRelatedFileExtensions>

    <Version>$([System.Text.RegularExpressions.Regex]::Match($(BuildName), `\d+\.\d+(?:.\d+)?(?:.\d+)?`))</Version>
    <Version Condition="'$(Version)' == ''">1.0.0.0</Version>
    <SourceRevisionId>$(Revision)</SourceRevisionId>
    <Company>My Company, Inc.</Company>
    <Copyright>Copyright © $([System.DateTime]::Now.Year) by My Company, Inc. All rights reserved.</Copyright>
    <Product>Smoke Tests</Product>
    <NeutralLanguage>en-US</NeutralLanguage>
  </PropertyGroup>

</Project>

Когда я собираю решение, созданный файл SmokeTests.1.0.0.nupkg не содержит никаких двоичных файлов, кроме самого SmokeTests.dll.Явно не то, что я хочу.

Как я могу получить все из bin \ debug \ net472 в созданный пакет NuGet без указания файла nuspec ?

Я всегда могу взломать шаг после сборки, который будет манипулировать файлом nupkg, но мне нужен правильный способ сделать это.

РЕДАКТИРОВАТЬ 1

Судя по количеству ответов, вопрос либо глупый, либо никто не использует ядро ​​.Net.Разместил это и здесь - https://social.msdn.microsoft.com/Forums/vstudio/en-US/aa25cb08-ff95-4d81-b0c3-9c4a395f9999/how-to-pack-the-products-from-multiple-projects-into-one-nuget-without-any-nuspec-file?forum=msbuild

Неужели SO потерял свое очарование?

EDIT 2

Я добавил следующие свойства в PublicLib.csproj для создания пакета NuGet:

<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageId>$(AssemblyName)</PackageId>
<NoPackageAnalysis>true</NoPackageAnalysis>
<IncludeBuildOutput>true</IncludeBuildOutput>
<AllowedOutputExtensionsInPackageBuildOutputFolder>.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>

И это почти работает, вот содержимое папки PublicLib.1.0.0.nupkg\lib\netstandard2.0:

enter image description here

Но IncludedLib.pdb отсутствует.

1 Ответ

0 голосов
/ 07 декабря 2018

Итак, после долгих часов проверки NuGet.Build.Tasks.Pack.targets я получил следующий код для свёрнутого проекта SmokeTests:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>

    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageId>$(AssemblyName)</PackageId>
    <NoPackageAnalysis>true</NoPackageAnalysis>
    <IncludeBuildOutput>true</IncludeBuildOutput>
    <AllowedOutputExtensionsInPackageBuildOutputFolder>.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
    <ContentTargetFolders>content</ContentTargetFolders>

    <GenerateNuspecDependsOn>MyCustomizePacking</GenerateNuspecDependsOn>
  </PropertyGroup>

  <Target Name="MyCustomizePacking" Returns="@(NuGetPackInput);@(_BuildOutputInPackage);@(_TargetPathsToSymbols)">
    <ItemGroup>
      <NuGetPackInput Remove="@(BuiltProjectOutputGroupKeyOutput);@(DebugSymbolsProjectOutputGroupOutput)"/>
      <_BuildOutputInPackage Remove="@(BuiltProjectOutputGroupKeyOutput)"/>
      <_TargetPathsToSymbols Remove="@(DebugSymbolsProjectOutputGroupOutput)"/>

      <NuGetPackInput Include="@(ReferenceCopyLocalPaths);@(AllItemsFullPathWithTargetPath)" />
      <_BuildOutputInPackage Include="%(ReferenceCopyLocalPaths.Identity)" >
        <TargetFramework>$(TargetFramework)</TargetFramework>
      </_BuildOutputInPackage>
      <_BuildOutputInPackage Include="%(AllItemsFullPathWithTargetPath.Identity)" >
        <TargetFramework>$(TargetFramework)</TargetFramework>
      </_BuildOutputInPackage>
    </ItemGroup>
  </Target>

  <ItemGroup>
    <Content Include="**\*.ps1" Exclude="PSTests\run.ps1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\NonUITests\NonUITests.csproj" />
    <ProjectReference Include="..\UITests\UITests.csproj" />
  </ItemGroup>

</Project>

Единственный способ найти способ упаковать весь свой проект и пакетссылки на NuGet заключались в том, чтобы подключиться к процессу через GenerateNuspecDependsOn, введя мою цель MyCustomizePacking.Эта цель выполняет следующие действия:

  1. Удалите SmokeTests.dll и SmokeTests.pdb из соответствующих групп элементов, поскольку это свернутый проект без отдельного кода, мне не нужна его dllили pdb внутри пакета.
  2. Включите @(ReferenceCopyLocalPaths) и @(AllItemsFullPathWithTargetPath) в соответствующие группы элементов.

Кажется, что работает, но я не доволен своей реализацией.Я хотел бы, чтобы была лучшая поддержка для этого.

...