【问题标题】:Build NuGet Package automatically including referenced dependencies自动构建 NuGet 包,包括引用的依赖项
【发布时间】:2013-04-23 15:38:38
【问题描述】:

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

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

具体来说:

  1. 创建解决方案
  2. 添加新项目
  3. 添加对各种.dll 文件/其他项目的引用
  4. 通过包管理器/cmdline/whatever 添加 NuGet 包
  5. something 自动创建.nupkg

根据我的发现,你应该这样做

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

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

我将满足于从项目引用中自动创建.nuspec 清单的东西。那么理论上 + nuget build-event 可以汇总到 build-project/nuget 包中,这是我真正想看到的。

【问题讨论】:

  • 我刚刚遇到了这个 VS 扩展 eyecatch.no/projects/nuget-package-template,我需要研究一下...
  • 五年后,nuget 4.x 规范或包仍然无法确定依赖关系。
  • 这个问题有更新吗?还是你还有这些问题?
  • 我不久前放弃了这个,但请查看this answer报告的 NuProj
  • 这个问题依然存在。 :(

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


【解决方案1】:

您的第 3 点(添加对各种 .dll 文件/其他项目的引用)确实包含两个不同的问题:(1)添加对各种 dll 文件的引用, (2) 在同一解决方案中添加对其他项目的引用。

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

nuget pack projectfile.csproj -IncludeReferencedProjects
  • 如果projectfile.csproj 引用了您的解决方案中也公开为 NuGet 包的任何其他项目,这些项目的 NuGet 包将作为依赖项添加。
  • 如果它在您的解决方案中引用的项目将自己公开为 NuGet 包,则它们的 dll 将包含在此 NuGet 包中。

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

【讨论】:

  • sigh #1 对于我的口味来说仍然过于手动。实际上,“使用这些文件创建自己的(内部)NuGet 包”是我想要做的——这个问题的重点是我想自动将非 NuGet .dll 汇总到 NuGet 包中。不要在.nuspec 中手动列出每个dll,我认为这是您的建议?
  • 您不必单独指定每个 DLL。如果你有 许多 个,那确实会做很多工作。列出要包含的文件时,您可以使用(递归)通配符 (docs.nuget.org/docs/reference/…),因此,如果您将所有这些 DLL 放在一个单独的文件夹中,那么将它们全部包含在内是一种简单的方式。
  • 它不会自动拾取 bin 目录中的任何内容,您必须明确指定它,如下所示:<file src="bin\release\*.dll" target="lib" />
  • 值得注意的是,如果被引用的项目碰巧有一个 nuspec 文件,那么 nuget 会将其视为一个包,而不是包含在 lib 文件夹中,而是将其添加到包依赖项中
  • .csproj 是否有等效于 IncludeReferencedProjects 的内容?
【解决方案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

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

.csproj 来自 NuGetPackTest 库,它引用了项目 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>

【讨论】:

  • 此解决方案不会将参考项目的 nuget 依赖项添加为依赖项。因此,您必须将在子项目中添加的所有 nuget 依赖项添加到将成为 nuget 包的主项目中。至少这是我遇到的情况,包括在另一个项目中创建的 nuget 包会导致“未找到程序集或文件”问题。
【解决方案3】:

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

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

【讨论】:

  • 听起来很有希望,但没有足够的信息来实际实施。你说的这个 NuGet.targets 文件是什么?我一般熟悉构建目标文件,但不熟悉这个特定用例
  • 也对 NuGet.targets 如何提供帮助感兴趣,也许此通知将有助于获得答案更新:)
  • 投了反对票,因为我不认为这条评论随着时间的推移而过时。
【解决方案4】:

看看这个!

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

您只需添加一个名为 NuGet 包的新项目:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多