所以我在项目A上引用了项目B.两者都是.net标准库。我想使用VS 2017创建一个nuget包。我只需在项目A上选中“在构建时生成Nuget包”来填充属性 - >包设置。
我甚至为B项目添加了
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
但是一旦我为Project A构建和nuget包就被创建了。它显示为项目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>
我的项目一个csproj文件没有任何packagereference作为项目B,如下所示它被设置为Projectreference
<ItemGroup>
<ProjectReference Include="..\ProjectB\ProjectB.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NETStandard.Library" Version="2.0.3" />
</ItemGroup>
在打包项目时,project to project references are considered by default as nuget package references。我能想到为什么这是一件好事的两个原因。
让我们考虑这两个原因
想象一下,有一些实用程序程序集utility.dll,我在我的程序包PackageA中使用它。如果我将PackageA.dll和utlity.dll都放在我的包中,但后来创建了一个也包含utility.dll的PackageB,那么如果一个项目同时使用PackageA和PackageB会有冲突,因为会有两个不同的utility.dlls 。通过每个程序包有一个程序集,将有一个PackageA和PackageB,它们都依赖于实用程序包的不同版本,而NuGet可以使用它的版本控制规则来选择一个。
想象一下,我有PackageB,它依赖于PackageA,我想做一个需要更改PackageA和PackageB的更改。如果PackageB有一个PackageAference到PackageA,这意味着我必须猜测我在PackageA中需要做哪些更改来完成PackageB中的更改,更改,提交,打包和发布PackageA,然后更改PackageB以使用新版本的PackageA 。但是,如果我猜测PackageA中所需的更改是错误的,那么我需要再次更改,提交,打包,发布PackageA,然后更改PackageB以使用新的新版本。使用包引用时,制作多包功能既缓慢又痛苦。
但是,通过使PackageA成为Package的项目引用,我可以修改PackageA,并且可以立即在Package中使用这些更改,而无需创建多个版本的PackageA.nupkg。