ita*_*aiy 10 visual-studio nuget nuget-package .net-core dotnet-cli
我正在使用dotnet pack命令为以下场景创建 NuGet 包:
项目结构:
Project B
|----> Project A
Project A
|----> SomePackage
Run Code Online (Sandbox Code Playgroud)
我想创建一个包含ProjectB.dll、ProjectA.dll和SomePackage作为 NuGet 包依赖项的 NuGet 包。
为了包含为 NuGet 包(而不是包依赖项)的一部分,我使用了此处ProjectA.dll建议的以下解决方案。
在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>
Run Code Online (Sandbox Code Playgroud)
问题:
当我运行时,dotnet pack ProjectB.csproj我得到一个包含 ProjectA.dll 和 Project B.dll 的单个包,但不依赖于SomePackage.
问题:
如何将依赖项添加SomePackage到ProjectBNuGet 包?
可能的解决方案:
SomePackage.ProjectB.nuspec文件并手动将依赖项添加到SomePakcage.两种方法的缺点:我需要为每个ProjectA使用的 NuGet 包添加依赖项,这很容易忘记且容易损坏。
您已使用PrivateAssets="all"项目A,这意味着它的传递依赖项是私有的,并且不能被主项目 B访问。我们通常用它来禁用引用项目的依赖关系。
因此,如果您使用它,您将无法从引用的项目中获取传递依赖项。它将使项目 A成为一个程序集 dll,并使其失去 nuget 包及其传递依赖项的能力。
如果你仍然想达到目标,你应该注意以下几点:
1)直接将项目A的csproj中的节点等传递依赖项复制PackageReference到项目B的csproj中。
<PackageReference Include="SomePackage" Version="*.*.*" />
......
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您不必使用ProjectB.nuspec或 nuget 包管理器 UI。
2)放弃使用PrivateAssets="all"项目A,将项目A打造成nuget包。确保其 nuget 功能的完整性。
除此之外,没有其他办法。
| 归档时间: |
|
| 查看次数: |
6882 次 |
| 最近记录: |