我正在使用dotnet pack
命令创建一个NuGet包,用于以下场景:
项目结构:
Project B
|----> Project A
Project A
|----> SomePackage
我想创建一个单一的NuGet包,其中包含ProjectB.dll
、ProjectA.dll
和SomePackage
作为NuGet包依赖项。
为了将ProjectA.dll
包含在NuGet包中(而不是作为包依赖项),我使用了以下解决方案,建议参考这里。
在 ProjectB.csproj
中:
<ProjectReference Include="ProjectA.csproj" PrivateAssets="all"/>
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
<ItemGroup>
<!-- Filter out unnecessary files -->
<_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/>
</ItemGroup>
<!-- Print batches for debug purposes -->
<Message Text="Batch for .nupkg: ReferenceCopyLocalPaths = @(_ReferenceCopyLocalPaths), ReferenceCopyLocalPaths.DestinationSubDirectory = %(_ReferenceCopyLocalPaths.DestinationSubDirectory) Filename = %(_ReferenceCopyLocalPaths.Filename) Extension = %(_ReferenceCopyLocalPaths.Extension)" Importance="High" Condition="'@(_ReferenceCopyLocalPaths)' != ''" />
<ItemGroup>
<!-- Add file to package with consideration of sub folder. If empty, the root folder is chosen. -->
<BuildOutputInPackage Include="@(_ReferenceCopyLocalPaths)" TargetPath="%(_ReferenceCopyLocalPaths.DestinationSubDirectory)"/>
</ItemGroup>
</Target>
问题:
当我运行dotnet pack ProjectB.csproj
时,我只得到了一个包含ProjectA.dll
和ProjectB.dll
的单个软件包,但没有依赖于SomePackage
。
问题是:如何将依赖项添加到ProjectB
NuGet软件包中的SomePackage
?
可能的解决方案:
- 手动从
ProjectB
添加对SomePackage
的软件包引用。 - 创建
ProjectB.nuspec
文件,并手动添加对SomePakcage
的依赖项。
这两种方法的缺点是:我需要为ProjectA
使用的每个NuGet软件包都添加依赖项,这很容易被遗忘并且容易出错。
PrivateAssets="all"
,因为我只需要创建一个包含所有项目引用和所有包依赖项的单个NuGet包。 选项1与我提到的相同,但在我的情况下,它的缺点更大,我有更多的项目引用,其中包括来自所有项目引用的约20个包引用,这意味着需要大量手动工作+很容易忘记依赖项并创建错误的NuGet包(只能在运行时检测到)。 - itaiyPackageReference
节点到“项目B”中。毕竟,“项目A”作为中间桥梁已经失去了Nuget功能,因此您必须将其依赖节点添加到“项目B”中。为了做到这一点,您必须这样做。 - Mr Qian