ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

具体来说:

创建解决方案添加新项目添加对各种 .dll 文件/其他项目的引用

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

手动编辑您的 .csproj 文件以添加 true 以包含依赖项

手动创建一个 .nuspec 文件并手动列出您的依赖项(类似?)

在 .nuspec 文件上手动运行 nuget pack

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

创建 .nuspec 模板 - 似乎不包括依赖项,只是元数据

通过构建事件(步骤#5)的nuget包,您需要手动将其添加到每个项目中,并且它有自己的怪癖:“$(SolutionDir).nuget\NuGet.exe”包“$(ProjectPath)”-Properties配置=释放移动 /Y *.nupkg "$(TargetDir)"

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

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

J
Jess

您的第 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 的内容?
j
joelc

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

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

https://i.stack.imgur.com/xm4yN.png

来自 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>

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

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

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

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

看一下这个!

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

https://i.stack.imgur.com/dAtYk.png

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


VS2017也有解决方案吗?
如果在构建服务器上生成包,这不起作用。
太糟糕了,这已被弃用。本来有用的。
我找到了一个 VS2017 版本:marketplace.visualstudio.com/… 和 VS2019 版本:marketplace.visualstudio.com/items?itemName=kamalraj.Nuproj201,虽然在初始测试时运气不佳,所以最后只是手动创建了文件。
P
PainElemental

我通过将整个 TargetDir 添加到 nuget 包中解决了这个问题。只需将其添加到 .csproj :

<Target Name="IncludeAllFilesInTargetDir" AfterTargets="Build">
  <ItemGroup>
    <None Include="$(TargetDir)\**">
      <Pack>true</Pack>
      <PackagePath>tools</PackagePath>
    </None>
  </ItemGroup>
</Target>