【问题标题】:How to pack the products from multiple projects into one nuget without any nuspec file?如何在没有任何 nuspec 文件的情况下将多个项目的产品打包到一个 nuget 中?
【发布时间】:2018-12-09 06:25:47
【问题描述】:

我正在使用面向 .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

难道SO失去了它的魅力?

编辑 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文件夹的内容:

但 IncludedLib.pdb 不见了。

【问题讨论】:

  • 我猜没人知道...
  • 你读过github.com/nuget/home/issues/3891,尤其是my comment吗?
  • 我需要检查您的解决方法。我需要项目引用的原因是 nuget 包将由章鱼使用,根据设计,章鱼需要 NuGet 中的所有依赖项。现在,我知道我可以使用 octopack,但这需要 nuspec 文件,而 octopack 本身是构建的另一个依赖项。我想避免两者。现在有意义吗?如果是这样,您能否提供带有代码示例的答案,以便我向您表示感谢?
  • @MartinUllrich - 你认为你可以改进你的样本以包含所包含项目的 pdb 吗?

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


【解决方案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 的唯一方法是通过注入目标 MyCustomizePacking 通过 GenerateNuspecDependsOn 挂钩到进程。该目标执行以下操作:

  1. 从相关项目组中删除 SmokeTests.dll 和 SmokeTests.pdb,因为这是一个汇总项目,本身没有代码,我不需要它的 dll 或 pdb 在包内。
  2. 在相关项目组中包含@(ReferenceCopyLocalPaths)@(AllItemsFullPathWithTargetPath)

似乎可行,但我对我的实施不满意。我希望对此有更好的支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2023-04-07
    • 1970-01-01
    • 2013-04-12
    • 2017-05-14
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多