引用的库使用 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文件是啥意思?
nuget 包中 exe 文件的位置和 nuspec 中匹配的文件标记
与 VS2017 和 FFMPEG 4 完全矛盾的未解决的外部符号 + 未使用的库