带有非 SDK 项目的 NuGet Msbuild Pack
NuGet Msbuild Pack with non-SDK project
我有一个“旧式”.NET 框架项目,其中包括 nuget 引用和其他项目引用。现在我切换到 PackageReference 格式(删除了 packages.config)。我想为我的项目创建一个 NuGet 包。所以我添加了对“NuGet.Build.Tasks.Pack”包的引用并使用了 MSBUILD 包目标。首先,它看起来一切如预期,生成的包包含我的所有引用和相应的 NuGet 引用。现在我遇到了问题,我也使用了一个项目作为项目参考:
<ProjectReference Include="..\Wrapper\MyWrapper\MyWrapper.csproj">
<Project>{6b9a7dd0-b93f-3a5e-8fdf-99d0bf811652}</Project>
<Name>MyWrapper</Name>
</ProjectReference>
基于 nuget 文档 - 供参考:
Project to project references are considered by default as nuget
package references
但我希望将此项目引用打包到我的包中,而不是“nuget 包引用”。我发现使用
的帖子
PrivateAssets="all"
对于项目引用可以解决问题,但将此属性添加到项目引用节点不会改变任何内容。任何帮助都会很棒!
我想你错过了什么。为 ProjectReference
设置 PrivateAssets="all"
是不够的。实际上,nuget 不会将引用的项目视为 nuget 依赖项,而且 nuget 也不会将其程序集 dll 打包到 nupkg 中。您需要其他节点。
试试这些指南:
假设您所有的 lib 项目都针对 net framework 4.7.2
。
1)在主工程的xxx.csproj
文件中添加PrivateAssets="all"
<ProjectReference Include="..\Wrapper\MyWrapper\MyWrapper.csproj">
<Project>{6b9a7dd0-b93f-3a5e-8fdf-99d0bf811652}</Project>
<Name>MyWrapper</Name>
<PrivateAssets>All</PrivateAssets>
</ProjectReference>
2)也在主工程的xxx.csproj
文件中添加这些节点,将程序集dll打包到nupkg中:
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
<ItemGroup>
<BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
</ItemGroup>
</Target>
3) 然后用这个命令打包工程:
msbuild -t:rebuild,pack -p:PackageOutputPath=xxx\xxx -p:Authors="xxx" -p:Version="x.x.x"
注意:在我这边,名为Mod
的主项目引用了一个名为Mod1
的项目。当我完成打包过程时,您可以在 nupkg 中看到这些。
它将引用的 dll 打包为库而不是 nuget 包。
我有一个“旧式”.NET 框架项目,其中包括 nuget 引用和其他项目引用。现在我切换到 PackageReference 格式(删除了 packages.config)。我想为我的项目创建一个 NuGet 包。所以我添加了对“NuGet.Build.Tasks.Pack”包的引用并使用了 MSBUILD 包目标。首先,它看起来一切如预期,生成的包包含我的所有引用和相应的 NuGet 引用。现在我遇到了问题,我也使用了一个项目作为项目参考:
<ProjectReference Include="..\Wrapper\MyWrapper\MyWrapper.csproj">
<Project>{6b9a7dd0-b93f-3a5e-8fdf-99d0bf811652}</Project>
<Name>MyWrapper</Name>
</ProjectReference>
基于 nuget 文档 - 供参考:
Project to project references are considered by default as nuget package references
但我希望将此项目引用打包到我的包中,而不是“nuget 包引用”。我发现使用
的帖子PrivateAssets="all"
对于项目引用可以解决问题,但将此属性添加到项目引用节点不会改变任何内容。任何帮助都会很棒!
我想你错过了什么。为 ProjectReference
设置 PrivateAssets="all"
是不够的。实际上,nuget 不会将引用的项目视为 nuget 依赖项,而且 nuget 也不会将其程序集 dll 打包到 nupkg 中。您需要其他节点。
试试这些指南:
假设您所有的 lib 项目都针对 net framework 4.7.2
。
1)在主工程的xxx.csproj
文件中添加PrivateAssets="all"
<ProjectReference Include="..\Wrapper\MyWrapper\MyWrapper.csproj">
<Project>{6b9a7dd0-b93f-3a5e-8fdf-99d0bf811652}</Project>
<Name>MyWrapper</Name>
<PrivateAssets>All</PrivateAssets>
</ProjectReference>
2)也在主工程的xxx.csproj
文件中添加这些节点,将程序集dll打包到nupkg中:
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
<ItemGroup>
<BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
</ItemGroup>
</Target>
3) 然后用这个命令打包工程:
msbuild -t:rebuild,pack -p:PackageOutputPath=xxx\xxx -p:Authors="xxx" -p:Version="x.x.x"
注意:在我这边,名为Mod
的主项目引用了一个名为Mod1
的项目。当我完成打包过程时,您可以在 nupkg 中看到这些。
它将引用的 dll 打包为库而不是 nuget 包。