100

我想运行本地/内部 NuGet 存储库。我想我已经想出了如何“重用”现有的 NuGet 包,方法是使用 NuGet 将它们包含在一个虚拟项目中并扫描包文件以获取我的本地缓存.nupkg文件,但是......

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

具体来说:

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

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

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

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

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

4

4 回答 4

86

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

于 2013-04-30T22:43:12.403 回答
15

我找到了一篇关于这个主题的写得很好的文章。我对某些具有依赖关系层次结构的包有同样的问题,到目前为止,我一直将每个包作为单独的 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>
于 2020-10-29T00:54:45.470 回答
5

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

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>
于 2015-04-21T18:14:50.817 回答
2

看一下这个!

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

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

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

于 2016-08-19T10:26:41.977 回答