【发布时间】:2018-09-06 00:06:52
【问题描述】:
我有一个桌面应用程序和一个针对 .Net 框架 4.6.2 的简单类库。最近我注意到,当我在 VS 2017 (15.6.3) 中更新我的 nuget 包时,其中一个开始引入一些更新的 netstandard2.0 程序集。
我渴望有一天能够构建网络标准库。但是现在我更喜欢将相应的 PCL(在同一个 nuget 包中可用)作为依赖项而不是 netstandard 程序集引入我的项目。我追求的nuget PCL程序集的目标是“portable-net45+win8+wp8+wpa81”。
我不想要 netstandard2.0 程序集的原因是因为它会导致一堆 shim 程序集出现在输出目录中,鉴于我的应用程序类库本身不针对 netstandard2.0,这有点过头了。发生的另一件事是 VS 开始为 System.ValueTuple 等不相关的包生成一堆版本冲突(编译器输出中的警告)。这似乎也与垫片相关(垫片可能来自路径 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\ net461\lib)
以下是我开始看到的版本冲突示例。
“Reference:System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL' 和 'Reference:System.ValueTuple' 之间发生冲突。选择“Reference:System.ValueTuple”,因为文件版本“4.6.26011.1”大于“4.6.25519.3”。
我希望这些只是警告,尽管非常可怕。我相信这些只是文件版本问题(与程序集版本无关),并且不认为它们会导致需要绑定重定向。即便如此,我会更高兴再次回到我的 PCL 并避免所有这些事情。我想一旦 .Net Framework 4.7.2 发布,我会更渴望使用和构建 netstandard 程序集。
我正在使用老式的 csproj 格式和用于 nuget 的 packages.config。似乎引入 netstandard2.0 位的 nuget 依赖项是 System.Composition。
System.Composition 1.1.0
System.Composition.AttributedModel 1.1.0
System.Composition.Convention 1.1.0
System.Composition.Hosting 1.1.0
System.Composition.Runtime 1.1.0
System.Composition.TypedParts 1.1.0
System.ValueTuple 4.4.0
希望这很清楚。我此时的解决方法是创建另一个面向 .Net 4.5 的类库,引入 System.Composition nuget 依赖项,运行 update-package,然后将包引用从 .Net 4.5 csproj 复制/粘贴到 .Net 4.6。 2 项目。然后我必须记住避免在那个 .Net 4.6.2 项目上更新我的包,否则它会覆盖我对 PCL 程序集的引用。
非常感谢任何帮助。我花了几个小时玩 nuget update 命令,但还没有找到避免 netstandard 的诀窍。我得到的最接近的是在 csproj 中使用“TargetFrameworks”而不是“TargetFrameworkVersion”,但也遇到了麻烦。
【问题讨论】:
-
这里使用旧的 package.config 代替 PackageReference 可以将 csproj 文件中的路径设置为 pcl 版本。
-
@magicandre1981 - 是的,这基本上就是我上面描述的解决方法。我在 4.5 的项目中使用 nuget update-package;这构成了我最初真正想要的正确路径。然后我只是将结果从一个 csproj 复制到另一个。
-
使用新的方式,您可以放松配置路径的选项。使用旧方法,直到包引用提供指定要加载的首选 DLL 的选项。
-
我想你是在告诉我,即使是旧方法也需要手动编辑 csproj 中的“提示路径”。这些手动编辑必须在包含 nuget 参考后执行。这并不理想,因为当我以后运行 nuget 命令时,它将覆盖我对提示路径所做的所有手动编辑。我想要一个不那么脆弱的解决方案。但是,如果您认为手动编辑提示路径是将项目指向 PCL 程序集的唯一方法,那么我想我可以接受这个作为答案。
-
我认为编辑是目前唯一的方法。试试看它是否有效。如果您使用源代码版本控制系统(SVN、Git、TFS),您可以详细跟踪每个更改。
标签: visual-studio-2017 package nuget printer-control-language .net-standard-2.0