首页 > 解决方案 > NuGet Msbuild Pack 与非 SDK 项目

问题描述

我有一个“旧式”.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 文档 - 供参考:

默认情况下,项目到项目的引用被视为 nuget 包引用

但我希望将这个项目引用打包到我的包中,而不是“nuget 包引用”。我发现使用的帖子

私人资产=“全部”

项目引用可以解决问题,但将此属性添加到项目引用节点不会改变任何内容。任何帮助都会很棒!

标签: c#visual-studiomsbuildnugetnuget-package

解决方案


我想你错过了一些东西。您PrivateAssets="all"ProjectReference. 实际上,nuget 不会将引用的项目视为 nuget 依赖项,并且 nuget 也不会将其程序集 dll 打包到 nupkg 中。您需要其他节点。

试试这些指导:

假设您所有的 lib 项目都是针对net framework 4.7.2.

1)添加主项目PrivateAssets="all"xxx.csproj文件。

<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-&gt;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.xml 中看到这些。

在此处输入图像描述

它将引用的 dll 打包为 lib 而不是 nuget 包。


推荐阅读