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

ycl3bljg  于 2023-03-03  发布在  其他
关注(0)|答案(6)|浏览(399)

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

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

具体而言:
1.创建解决方案
1.添加新项目
1.添加对各种.dll文件/其他项目的引用 〈--这是缺少的部分 *
1.通过包管理器/cmdline/whatever添加NuGet包
1.
something * 会自动创建.nupkg
据我所知,你应该做的事情

  • 手动编辑您的.csproj文件以添加<BuildPackage>true</BuildPackage>以包括相关性
  • 手动创建一个.nuspec文件并手动列出你的依赖项(similar ?
  • .nuspec文件上手动运行nuget pack

但是所有的东西都是手动的,这很愚蠢,即使是半自动的解决方案也很笨拙,或者说是半手动的:

"$(SolutionDir).nuget\NuGet.exe" pack "$(ProjectPath)" -Properties Configuration=Release
move /Y *.nupkg "$(TargetDir)"

我将满足于从项目引用自动创建.nuspec清单的东西,然后理论上+nuget构建事件可以被卷到一个构建项目/nuget包中,这是我真正想看到的。

twh00eeo

twh00eeo1#

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

mbskvtky

mbskvtky2#

我发现了一篇关于这个主题的文章,我也有同样的问题,有些软件包有依赖关系的层次结构,到目前为止我一直把每个包作为一个单独的NuGet包上传(浪费时间)
我刚刚测试了这里找到的解决方案:https://dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p
在使用NuGet Package Explorer检查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>
ssgvzors

ssgvzors3#

对于其他Google用户,如果您正在使用NuGet.targets文件运行NuGet Pack,则可以使用此命令:

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

8yparm6h4#

看看这个!
我发现的解决方案是Visual Studio的扩展:https://visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96/view/Reviews
您只需添加名为NuGet Package的新项目:

然后你将有趣的项目添加到引用中,所有的依赖项和文件目录都会自动添加。如果你想修改NuSpec数据,你可以在项目上点击右键,进入属性,然后修改你想要的。生成的NuSpec和nupkg将在你的新项目的obj文件夹中。我希望它能帮助你;).

6vl6ewon

6vl6ewon5#

我通过将整个TargetDir添加到nuget包来解决这个问题。只需将以下内容添加到.csproj:

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

sauutmhj6#

最初的NuGet包会包含本地项目dll,如果你使用packages. config,任何nuget包都会被列为依赖项。
微软已经简化了所有的东西,所以现在. net(core)所有的东西都是从项目文件中完成的,这是我更喜欢的。但是现在使用nuget pack,你得到的包将没有依赖项列出。
微软表示,NuGet不支持PackageReferences
NuGet CLI
因此,您需要使用dotnet packmsbuild-t:pack
dotnet CLI
然而,现在使用dotnet包,您的PackageReferences具有依赖项,但您的ProjectReferences现在也列为依赖项.....
下面是一个示例项目文件,其中包含PackageReferences和ProjectReferences。对于项目,它们已标记为PrivateAssets ="All",然后使用自定义生成目标将所需文件从项目复制到包中。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Title>Some.Project</Title>
  </PropertyGroup>

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Something" Version="1.0.0" />
  <PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
</ItemGroup>

<ItemGroup>
  <ProjectReference Include="..\Some.Other.Project.csproj" PrivateAssets="All" />
</ItemGroup>

<PropertyGroup>
  <TargetsForTfmSpecificBuildOutput> $(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>

<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
  <ItemGroup>
  <_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/>
  </ItemGroup>

  <ItemGroup>
    <BuildOutputInPackage Include="@(_ReferenceCopyLocalPaths)" TargetPath="%(_ReferenceCopyLocalPaths.DestinationSubDirectory)"/>
  </ItemGroup>
</Target>
</Project>

NuGet pack task doesn't include dependencies when using PackageReference #10301nuget pack is ignoring dependencies when using PackageReference instead of packages.config #5979
伟大的指南和例子约瑟夫Ottosson Include Referenced Projects - Josef Ottosson

相关问题