自动构建NuGet包,包括引用的依赖项

时间:2013-04-23 15:38:38

标签: visual-studio build-automation nuget nuget-package

我想要run a local/internal NuGet repository。我想我已经弄清楚如何“重用”现有的NuGet包,方法是将它们包含在使用NuGet的虚拟项目中并将包文件扫描到grab my locally-cached .nupkg files,但是......

如何从项目中创建nuget包(.nupkg),自动包括所有 dll依赖项,而不仅仅是通过NuGet获取的那些?

具体做法是:

  1. 创建解决方案
  2. 添加新项目
  3. 添加对各种.dll个文件/其他项目的引用< - 这是缺少的部分
  4. 通过包管理器/ cmdline / whatever
  5. 添加NuGet包
  6. 某些内容会自动创建.nupkg
  7. 从我发现的,你应该做的事情

    • 手动编辑您的.csproj文件以添加<BuildPackage>true</BuildPackage>以包含依赖项
    • 手动创建.nuspec文件并手动list your dependenciessimilar ?
    • nuget pack文件
    • 上手动运行.nuspec

    但是一切都是手动的,这是愚蠢的。即使是半自动解决方案仍然很笨拙或半手动:

    我会满足于从项目引用中自动创建.nuspec清单的内容。然后理论上+ nuget构建事件可以汇总到构建项目/ nuget包中,这是我真正想要看到的。

4 个答案:

答案 0 :(得分:56)

你的观点#3(添加对各种.dll文件/其他项目的引用&lt; - 这是缺失的部分)确实包含两个不同的问题:(1)添加对各种dll文件的引用,(2)在同一解决方案中添加对其他项目的引用。

此处的数字(2)从NuGet 2.5开始获得了一些额外的支持。在为项目创建NuGet包时,您可以添加一个选项以包含对同一解决方案中其他项目的引用:

nuget pack projectfile.csproj -IncludeReferencedProjects

如果projectfile.csproj引用了您的解决方案中也显示为NuGet包的任何其他项目,则这些项目的NuGet包将作为依赖项添加。如果它引用了解决方案中将自己暴露为NuGet包的项目,那么它们的dll将包含在此NuGet包中。

对于(1),如果你发现自己经常在你的项目中添加不能作为NuGet包使用的dll,你可以用这些文件创建自己的(内部)NuGet包。如果您随后将这些dll作为NuGet包而不是直接添加到文件中,则此NuGet包将成为项目的NuGet包中的依赖项。

答案 1 :(得分:4)

对于其他Google员工,如果您使用NuGet.targets文件运行NuGet Pack,则可以使用此功能:

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>

答案 2 :(得分:2)

我找到了一篇写得很好的文章。对于某些具有依存关系层次结构的软件包,我也有同样的问题,直到现在,我一直将每个软件包作为单独的NuGet软件包上传(浪费时间)。

我刚刚测试了此处找到的解决方案:https://dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p

在使用NuGet软件包资源管理器检查了NuGet软件包之后,确实存在由引用项目生成的DLL。我将通过实际将这个包提交给NuGet并进行测试来进行测试。

这是我的消息来源,以防您对您有所帮助:https://github.com/jchristn/NuGetPackTest

测试NuGet包:https://www.nuget.org/packages/NuGetPackTest/1.0.0

该解决方案似乎运行良好。我不知道当有多层引用时会是什么样子,我敢肯定它会变得很毛茸茸而且很快。

enter image description here

来自NuGetPackTest库的

.csproj,它引用了项目TestLibrary(为简洁起见,删除了部分内容)

<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>

    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
  
</Project>

答案 3 :(得分:1)

看看这个!

我找到的解决方案是Visual Studio的扩展: https://visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96/view/Reviews

您只需添加名为Nuget Package的新项目 NuGet Package

然后你将有趣的项目添加到参考和BOOOM !! 将自动添加所有依赖项和文件目录。 如果要修改NuSpec数据,请在项目中单击,然后转到“属性”, 然后修改你想要的。 生成的NuSpec和nupkg将位于新项目的文件夹 obj 中。 我希望它有所帮助;)。