Dotnet pack / nuget pack - 如何简单地将多个项目打包到一个包中(所有项目都包含在 .csproj 中)并进行测试?

问题描述 投票:0回答:1

网上关于此的类似讨论很少,但都是旧的,没有“从头到尾”复杂的解决方案,只有很少的具体问题。

我想将多个项目打包在一个包中,但我不能,因为自 2016 年以来 Microsoft 完全忽略了这个问题。

不再推荐使用

nuget pack
,但它有
-IncludeReferencedProjects
标志。所以我想用
dotnet pack
命令来做到这一点。 https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack

以下是关于此问题的长篇文章(470 条评论): https://github.com/NuGet/Home/issues/3891 或者只是一些其他讨论: 使用 dotnet pack 打包多个程序集

但是你能告诉我如何简单地打包我的主项目和.csproj文件中包含的所有项目吗(

<PackageReference Include="">
)?

.net nuget project pack packagereference
1个回答
0
投票

花了几天时间我可以解决所有问题:

  1. 如果你不想改变
    .csproj
    ,那么唯一的方法就是创建多个包。
  2. 不要使用Azure进行测试,太麻烦了。 创建本地 NuGet feed(在 PC 上的任意位置创建文件夹,在 Visual 或 Rider 中添加新的 feed,将其命名为“LocalNugetFeed”并指向您之前创建的目录。然后将您的
    dotnet pack
    结果(
    .nupkg
    文件放入其中)这个文件夹)。
  3. 请记住,NuGet 包在本地存储/缓存,因此,如果您修改并创建具有相同名称的(默认名称,因此类似于
    my.package.1.0.0-dev.nupkg
    ),则必须使用
    dotnet nuget locals all --clear
    。否则,即使在将“更新”版本安装到您的项目/解决方案后,它仍然会从缓存中获取旧版本。
  4. 您的包裹必须包含
    otherProject.dll
    。要检查它,只需复制粘贴您的
    .nupkg
    ,将文件扩展名更改为
    .zip
    ,打开它,转到
    lib/net<your-version>
    并检查是否有您所有的 .dll。所以如果你有主项目和 5 个
    <PackageReferences> to your local projects, you need to have 5+1 
    .dll`.

现在我们来解决主要问题,如何将多个项目打包到一个包中:

  1. 在解决方案中创建
    pack.props
    文件(最好是在主项目中),位于 main-project.csproj 下方。或者,如果您想在全球范围内使用它,请在您的解决方案中创建它:
  • 复制粘贴此代码,不要更改它:

    <Project>
      <PropertyGroup>
        <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
      </PropertyGroup>
      <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
        <ItemGroup>
          <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))" />
        </ItemGroup>
      </Target>
    </Project>
    
  • 修改你的

    .csproj
    (根据自己调整):

    <Project Sdk="Microsoft.NET.Sdk">
      <Import Project="pack.props" />
    
      <PropertyGroup>
        <Nullable>warnings</Nullable>
        <TargetFramework>net8.0</TargetFramework>
        <NeutralLanguage>en-US</NeutralLanguage>
        <Description>My Description</Description>
        <Authors>My Authors</Authors>
        <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
      </PropertyGroup>
    
      <ItemGroup>
        <ProjectReference Include="..\MyProject\MyProject.csproj" PrivateAssets="All" />
      </ItemGroup>
    </Project>
    
  1. 或者最终使用
    .nuspec
    文件:

https://medium.com/@dinko.pavicic/nuget-packaging-bundling-multiple-projects-with-nuspec-41547bb2b92f

  • dotnet pack -p:NuspecFile=MyFile.Bundled.nuspec -o nupkgs
© www.soinside.com 2019 - 2024. All rights reserved.