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


80

我想运行本地/内部NuGet存储库。我想我已经找到了如何通过使用NuGet将其包含在虚拟项目中并扫描该软件包文件以获取我本地缓存的.nupkg文件的方式来“重用”现有的NuGet软件包,但是...

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

特别:

  1. 创建一个解决方案
  2. 添加一个新项目
  3. 添加对各种.dll文件/其他项目的引用<-这是缺少的部分
  4. 通过程序包管理器/ cmdline /添加NuGet程序包
  5. 某些东西会自动创建.nupkg

根据我的发现,您应该做类似的事情

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

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

我将解决自动.nuspec从项目引用创建清单的问题。然后,从理论上讲,可以将+ nuget构建事件汇总到一个build-project / nuget包中,这是我真正想要看到的。


我刚刚遇到了这个VS扩展eyecatch.no/projects/nuget-package-template,我需要研究一下……
drzaus 2014年

3
五年后,nuget 4.x规范或软件包仍然无法确定依赖性。
StingyJack

这个问题有更新吗?还是您还有这些问题?
多米尼克·乔纳斯

我前一阵子放弃了,但是查看了此答案
NuProj

此问题仍然存在。:(
BrainSlugs83

Answers:


75

第3点(添加对各种.dll文件/其他项目的引用<-这是缺少的部分)确实包含两个不同的问题:(1)对各种dll文件添加引用,以及(2)在Windows中添加对其他项目的引用相同的解决方案。

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包中的依赖项。


3
叹息#1仍然是我的口味太手册。实际上,我正在尝试“使用这些文件创建自己的(内部)NuGet程序包”-这个问题的全部重点是我想将非NuGet .dlls自动汇总到NuGet程序包中。不通过手动将每个dll列出.nuspec,我认为这是您的建议?
drzaus

您不必分别指定每个DLL。如果您有很多的话,那确实是很多工作。列出要包含的文件时,可以使用(递归)通配符(docs.nuget.org/docs/reference/…),因此,例如,如果将所有这些DLL放在单独的文件夹中,则包括在内就可以商场。
朱利安

嗯,现在我要走到哪里去了-因此,如果我创建一个包装项目,则通过通常的“右键单击项目>添加引用”nuspec包含引用,那么我可以创建一个包含bin目录中所有内容的对象(假设引用是都是“本地复制”),它会自动根据我添加的内容进行选择。似乎有点受挫,但可能会起作用。
drzaus

6
它不会自动提取bin目录中的内容,您必须明确指定它,例如:<file src="bin\release\*.dll" target="lib" />
朱利安(Julian)

2
值得注意的是,如果所引用的项目恰好具有nuspec文件,则nuget会将其视为一个包,不包含在lib文件夹中,而是将其添加到包依赖项中
workabyte '18

5

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

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

7
听起来很有希望,但信息不足以实际实施。您说的这个NuGet.targets文件是什么?我总体上熟悉构建目标文件,但不熟悉此特定用例
bikeman868 '19

2

看一下这个!

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

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

然后,您将有趣的项目添加到引用和BOOOM中!所有依赖项和文件目录都会自动添加。如果要修改NuSpec数据,请在项目上单击鼠标右键,然后转到“属性”,然后修改所需的内容。生成的NuSpec和nupkg将位于新项目的文件夹obj中。希望对您有所帮助;)。


1
VS2017还有解决方案吗?
多米尼克·乔纳斯

如果在构建服务器上生成软件包,这将不起作用。
Michi-2142 '18

太可惜了,不推荐使用。本来会有用的。
joelc

1

我找到了一篇写得很好的文章。对于某些具有依存关系层次结构的软件包,我也有同样的问题,直到现在,我一直将每个软件包作为单独的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

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

在此处输入图片说明

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>

1
这立即解决了我的问题。我按照链接中所述的说明进行了操作。很高兴在您的回答中加上要点。
Jabez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.