减少.NET Standard类库的依赖关系?

6
我已经使用Visual Studio 2017将我的一些类库转换为.NET Standard。这很容易,只需在原始项目中添加一个.NET Standard类库项目并添加其中的所有文件。现在.csproj文件甚至看起来像一个nuspec文件,带有包信息等。在项目选项中,有一个名为“Generate NuGet package on build”的复选框,我勾选了它。非常简单。
然而,我的类库的.NET Framework消费者现在会获得大量依赖项,我数了至少20个其他NuGet包被添加,其中大多数对我的库来说完全不必要。换句话说,“easy peasy”太容易了吗?
这只是我仅使用.NET Standard作为构建输出的副产品,我应该再次添加一个.NET Framework库吗?
例如,即使它们完全不必要,下列软件包也将被添加到使用我的库的项目中:
  • System.Security.Cryptography.*
  • System.Xml.*
  • System.IO.*

等等,有很多包被添加了。我的库只是“崇高的”数组分析,并且不需要太多。

Visual Studio项目配置为目标.NET Standard 1.0,唯一可见的引用是“NETStandardLibrary”,因此并不像我自己添加了所有这些。

我已经检查了包,看起来它也没有列出所有这些。

我能只添加我需要的包而仍然以.NET Standard 1.0为目标吗?

我的类库在这里开源:https://github.com/lassevk/DiffLib
Nuget包在这里:http://www.nuget.org/packages/difflib/2017.4.24.2347


我特别高兴的是,制作NuGet包非常容易。如果我回到多个构建输出,我需要自己维护nuspec和构建系统,而不是让Visual Studio现在处理它。 - Lasse V. Karlsen
你不能轻易看到的是,你实际使用的包所需要完成工作的那些其他包。上周,.NETCore团队承认将corefx分开是一个错误,并且引发了比解决的问题更多的麻烦。随着v2.0的发布,这个问题将很快得到修复,希望在稳定后,这将只是一个不好的回忆。 - Hans Passant
好的,根据平台支持矩阵,我可能需要同时包括2.0和1.0作为可能的目标,以至少帮助使用较新运行时的人们。然而,我不太愿意只升级到2.0并放弃1.6,因为该矩阵包含了更多由1.0支持的框架版本。这似乎是可行的,因为我知道可以通过手动“hack”项目文件来列出多个标准版本目标。谢谢。 - Lasse V. Karlsen
虽然如果我只需要其中的1或2个软件包,那将包括一些依赖项,这也很好,但我猜这样的事情只能通过升级到2.0来解决,1.x在这方面不会变得更好,你是这个意思吗?如果是,请发布一个答案,以便我接受它。 - Lasse V. Karlsen
1个回答

6

目前情况非常复杂:

我能只添加所需的包并仍然针对.NET Standard 1.0吗?

是的,您可以这样做,但这不再被推荐。实质上,.NET Standard是由引用它的包组成的规范。支持的方式是引用NETStandard.Library,因为它保证为您带来所有需要的编译引用和逻辑,以便正确构建。

从即将发布的netstandard2.0开始,NETStandard.Library将成为一个没有依赖关系的平面包,并且如果您的项目或任何其他项目引用了它们,则会从依赖树中删除单个包。此外,NETStandard.Library将不作为依赖项发布 - 因此,如果您构建一个netstandard2.0库,则生成的NuGet包将没有依赖关系。(使用它在.net framework项目中时需要安装NETStandard.Library.NETFramework - NuGet应该会自动完成此操作)。

话虽如此,如果您确实想这样做,可以设置

<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>

csproj 文件中添加诸如 <PackageReference Include="System.[Something]" Version="4.3.0" /> 的项目以满足您的需求。请注意不要删除任何 HTML 标签。

此外,NETStandard.Library不会作为依赖项发布 - 因此,如果您构建一个netstandard2.0库,则生成的NuGet包将没有任何依赖项。- 我感到困惑。我刚刚打包了一个针对netstandard 2的库,这是生成的nuspec: <dependencies> - Darrell
看起来你是用旧的工具构建的 - 可能是 1.0.* 或者使用了 project.json 的预览版本?那些版本中没有任何保障措施。 - Martin Ullrich
在构建 .net standard 2.0 时,请确保在项目目录内的命令行中运行 dotnet --version 至少显示 2.0.0 - Martin Ullrich
谢谢。我更新了各种NuGet包(包括Xamarin.Forms)- 进行了另一个打包,结果它现在可以工作了 :-) - Darrell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接