带有非 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-&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 中看到这些。

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