gpt4 book ai didi

c# - 如何在没有任何 nuspec 文件的情况下将多个项目的产品打包到一个 nuget 中?

转载 作者:行者123 更新时间:2023-12-05 02:14:24 28 4
gpt4 key购买 nike

我正在使用面向 .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 文件夹的内容:

enter image description here

但是缺少 IncludedLib.pdb。

最佳答案

因此,在长时间检查 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 中的唯一方法是通过注入(inject)我的目标 MyCustomizePacking 通过 GenerateNuspecDependsOn Hook 到流程中。该目标执行以下操作:

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

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

关于c# - 如何在没有任何 nuspec 文件的情况下将多个项目的产品打包到一个 nuget 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53625112/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com