引用的库使用 VS 2017 在 Nuspec 中注册为其他 nuget 引用

Posted

技术标签:

【中文标题】引用的库使用 VS 2017 在 Nuspec 中注册为其他 nuget 引用【英文标题】:Referenced library is registered as other nuget reference in Nuspec using VS 2017 【发布时间】:2019-03-08 14:50:24 【问题描述】:

所以我在项目 A 上引用了项目 B。两者都是 .net 标准库。我想使用 VS 2017 创建一个 nuget 包。 我只是通过检查项目 A 上的“生成 Nuget 包”来填充属性-> 包设置。

我什至为 B 项目添加了

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

但是一旦我为项目 A 构建并创建了 nuget 包。它显示为 Project B 是另一个 nuget 包参考。如果我解压缩 nupkg 文件,在 nuspec 中,我可以看到以下几行

 <dependencies>
      <group targetFramework=".NETStandard2.0">
        <dependency id="ProjectB" version="1.0.0" exclude="Build,Analyzers" />
        <dependency id="NETStandard.Library" version="2.0.3" exclude="Build,Analyzers" />        
      </group>
    </dependencies>

您可以看到 projectB 被视为 nuget 包引用。安装时失败还说“找不到 ProjectB nuget” 为什么会这样?这是VS 2017中的错误吗? 我什至在 ProjectA 中添加了以下设置,它应该包含 ProjectB 作为 dll 工作正常。但尽管如此,它也注册为 nuget 依赖项

<Target Name="IncludeP2PAssets">
    <ItemGroup>
      <BuildOutputInPackage Include="..\ProjectB\bin\Release\netstandard2.0\ProjectB.dll" />
    </ItemGroup>
  </Target>

我的项目A csproj文件没有任何包引用作为项目B,如下它被设置为项目引用

  <ItemGroup>
    <ProjectReference Include="..\ProjectB\ProjectB.csproj" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="NETStandard.Library" Version="2.0.3" />
  </ItemGroup>

【问题讨论】:

【参考方案1】:

打包项目时,project to project references are considered by default as nuget package references。我可以想到两个为什么这是一件好事。

    建议每个包打包一个组件 简化包作者的开发体验

让我们考虑这两个原因

    建议每个包打包一个组件

假设有一些实用程序程序集utility.dll,我在我的包PackageA 中使用它。如果我将 PackageA.dll 和 utlity.dll 都放在我的包中,但后来创建了一个还包含实用程序.dll 的 PackageB,那么如果单个项目同时使用 PackageA 和 PackageB,则会出现冲突,因为会有两个不同的实用程序.dll .通过每个包有一个程序集,就会有一个 PackageA 和 PackageB,它们都依赖于实用程序包的不同版本,NuGet 可以使用它的版本控制规则来选择一个。

    简化包作者的开发体验

想象一下,我有一个依赖于 PackageA 的 PackageB,而我想要做出一个需要同时更改 PackageA 和 PackageB 的更改。如果 PackageB 对 PackageA 有 PackageReference,这意味着我必须猜测 PackageA 需要进行哪些更改才能完成 PackageB 中的更改,更改、提交、打包和发布 PackageA,然后更改 PackageB 以使用新版本的 PackageA .但是,如果我对 PackageA 中所需更改的猜测是错误的,那么我需要再次更改、提交、打包、发布 PackageA,然后更改 PackageB 以使用新的新版本。使用包引用时,制作多包功能既慢又痛苦。

但是,通过使 PackageA 成为 PackageB 的项目引用,我可以修改 PackageA,并且这些更改可以立即在 PackageB 中使用,而无需创建 PackageA.nupkg 的多个版本。

【讨论】:

以上是关于引用的库使用 VS 2017 在 Nuspec 中注册为其他 nuget 引用的主要内容,如果未能解决你的问题,请参考以下文章

在vs2017上重新建立一个project和.c文件是啥意思?

如何在octopack中使用nuspec中设置的版本号?

nuget 包中 exe 文件的位置和 nuspec 中匹配的文件标记

与 VS2017 和 FFMPEG 4 完全矛盾的未解决的外部符号 + 未使用的库

vs2017+opencv+qt+cuda,使用cmake编译opencv的库

vs2012怎么添加web引用