我想run a local/internal NuGet repository。我想我已经想出了如何“重用”现有的 NuGet 包,方法是使用 NuGet 将它们包含在一个虚拟项目中并将包文件扫描到 grab my locally-cached .nupkg
files,但是......
如何从项目创建 nuget 包 (.nupkg),自动包含所有 dll 依赖项,而不仅仅是通过 NuGet 获取的那些?
具体来说:
创建解决方案添加新项目添加对各种 .dll 文件/其他项目的引用
根据我的发现,你应该做类似的事情
手动编辑您的 .csproj 文件以添加
手动创建一个 .nuspec 文件并手动列出您的依赖项(类似?)
在 .nuspec 文件上手动运行 nuget pack
但是一切都是手动的,这很愚蠢。即使是半自动的解决方案仍然很笨拙或半手动:
创建 .nuspec 模板 - 似乎不包括依赖项,只是元数据
通过构建事件(步骤#5)的nuget包,您需要手动将其添加到每个项目中,并且它有自己的怪癖:“$(SolutionDir).nuget\NuGet.exe”包“$(ProjectPath)”-Properties配置=释放移动 /Y *.nupkg "$(TargetDir)"
我将满足于从项目引用中自动创建 .nuspec
清单的东西。然后理论上 + nuget build-event 可以汇总到 build-project/nuget 包中,这是我真正想看到的。
您的第 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 包中的依赖项。
我找到了一篇关于这个主题的写得很好的文章。我对某些具有依赖关系层次结构的包有同样的问题,到目前为止,我一直将每个包作为单独的 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>
对于其他 Google 员工,如果您使用 NuGet.targets 文件运行 NuGet Pack,则可以使用此功能:
<Target Name="PrePackage" BeforeTargets="BuildPackage">
<PropertyGroup>
<BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
</PropertyGroup>
</Target>
看一下这个!
我找到的解决方案是 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 中。我希望它有所帮助;)。
我通过将整个 TargetDir 添加到 nuget 包中解决了这个问题。只需将其添加到 .csproj :
<Target Name="IncludeAllFilesInTargetDir" AfterTargets="Build">
<ItemGroup>
<None Include="$(TargetDir)\**">
<Pack>true</Pack>
<PackagePath>tools</PackagePath>
</None>
</ItemGroup>
</Target>
.nuspec
中手动列出每个 dll,我认为这是您的建议?<file src="bin\release\*.dll" target="lib" />
.csproj
是否有等效于IncludeReferencedProjects
的内容?