如何将多个项目中的产品打包到一个无任何nuspec文件的nuget中?

时间:2018-12-05 04:18:33

标签: c# .net .net-core nuget

我正在使用针对.NET Framework 4.7.2的Sdk项目。项目结构为:

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

其中:

  • SmokeTests项目使用ProjectReferences引用了UITests和NonUITests
  • UITests和NonUITests都使用ProjectReference引用Common
  • UITests,NonUITests和Common使用PackageReferences引用一些NuGet软件包
  • SmokeTests项目没有源代码,但确实有一些内容文件。

我将SmokeTests项目用作汇总项目。构建它时,其bin \ debug \ net472目录包含了我想要在nuget包中包含的所有二进制文件和符号,即:

  • UITests,NonUITests和Common的NuGet依赖项
  • UITests,NonUITests和Common的dll
  • 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>

我还有一个Directory.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本身除外。显然不是我想要的。

如何在不指定nuspec文件的情况下将所有内容从bin \ debug \ net472放入生成的NuGet包中??

我总是可以修改可操作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

是不是让它失去了魅力?

编辑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 :(得分:1)

因此,在长时间检查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)

似乎可以工作,但是我对自己的实施不满意。我希望对此有更好的支持。