【问题标题】:.NET Core - solutions, frameworks, imports, runtimes.NET Core - 解决方案、框架、导入、运行时
【发布时间】:2016-06-02 07:58:32
【问题描述】:

我正在着手改写一组框架库以使用 .NET Core。以为我会等待 RC2 并热衷于陷入困境。

我借此机会近距离接触构建系统、配置、从头开始编写所有内容,以便更深入地了解并且没有我不想要/不需要的不必要的包袱。然而,缺乏文档使这变得相当困难..所以我想在这里问一下,毫无疑问聪明的 .NET Core 人藏在哪里;)

我知道这个问题很长并且有很多子问题。但我觉得可以通过一个文档链接或知情人士的几行简明来回答。感谢您对我的包容,我希望这可能成为其他人的有用答案资源,试图了解 .NET Core 的好方法。


首先,global.json。我希望在同一个“解决方案”中有多个项目和组件。通过另一个 SO 问题,我发现了这个隐藏链接:http://dotnet.github.io/docs/project-model/global-json-reference.html - 但似乎没有 VS 工具可以从头开始设置或使用它。

1) global.json 问题

A) 这些文档指的是什么构建系统? dotnet build? (帮助说明它只是构建一个项目——如果它是“解决方案”——如果它仍然是这个名称——它是否只是在所有子文件夹上运行dotnet build?)。

B) 周围的许多示例都有 "sdk" 属性 - 但 EF Core 没有它,而且新的“单句样式”文档也没有引用它。 The official RC2 migration guide for ASP.NET Core has it 还在吗?如果是这样,为什么需要它?它有什么用?它有哪些选择?


接下来是project.json 和框架。我想了解这里的框架选项。有清单吗?官方指导? dotnet new 使用 netcoreapp1.0"official docs" 使用 dnxcore50this GH discussion from last month 的示例也提出了 netcore1.0 作为框架(与应用程序)的可能性的问题。

此外,imports。我对命名感到非常困惑 - 文档说这是该项目兼容的其他框架的列表..

2) project.json 框架问题 -

A) 我在哪里可以找到有关框架选项的最新或维护列表或一组建议?

B) 如果我对import 用途的理解是正确的,为什么会这样命名?如果不是,它究竟导入了什么?

C) 为什么每个framework 属性都有一个import 属性?如果要表明整个项目与另一个框架兼容,那似乎最好放在project.json的顶层,不是吗?

D) 我应该如何决定应该使用哪些import 选项? dotnet new 刚刚拥有dnxcore50 - 需要满足哪些包? This guy 建议 dotnet5.6dnxcore50portable-net45+win8


最后,我正在构建类库、测试项目、控制台实用程序。所以..

3) 参考资料和软件包

A) 按照dotnet new,我是否总是想要Microsoft.NETCore.App?还有其他基线选项吗?选择指导?一份清单?

B) 文档没有提及type 选项(buildplatform)。有没有关于这些的指导?

C) 我的一些项目将使用 ASP.NET。在哪里找到正确的参考包的最佳位置? NuGet 上似乎有一百万个版本和包。 This tutorial 只是谈论引用 Microsoft.AspNetCore.Server.Kestrel - 唯一引用的 ASP.NETty 事物是 Microsoft.AspNetCore.Hosting。这是否意味着一个包大部分是 ASP.NET?

【问题讨论】:

  • 我也觉得很乱。
  • 在这些问题上做得很好。我知道微软已经迫于压力要尽可能快地推出 RC2,并且文档可能会随着时间的推移而趋于完善,但到目前为止,文档看起来并没有对人们实际遇到的问题做出回应。由于除非绝对必要并且即将在一个月内发货,否则它们都不应再更改,因此我希望他们尽快开始填写文档。
  • 一个简短的说明,不要把它读成呻吟——这只是我想知道的东西,而且似乎相当“基线”来理解。我很想编译答案并写一篇“从头开始的.NET Core”博客文章。例如,每个 .json 文件的每一行都解释了它的含义、为什么需要它。
  • 回答你所有的问题需要一辈子的时间,所以我宁愿留下评论,让你等到工具(目前处于预览版 1)变成 RTM(几个月后)。绝对核心运行时(.NET Core)将在本月底(6 月)之前为 RTM,但微软在工具部分进行了另一系列更改(从 .json 尝试移回 MSBuild),所以即使有人花给你一些答案的时间,它们很快就会过时(就像你参考的文档一样)。 RC1之后我跳上了船,我已经很累了。

标签: asp.net-core .net-core .net-core-rc2


【解决方案1】:

你有很多问题。没有单独的文档,因为问题不是那么简单;)

global.json

  • global.json 构建系统:global.json(作为 project.json)不指定构建系统(例如 msbuild csproj 文件除外)。目前,只有dotnet build 可用(在 VS 中使用时由 msbuild xproj 代理)。这将更改为msbuild,因为完整的工具处于预览/测试阶段,不会在 6 月底发布。它遍历所有子文件夹并构建内容。它也是查找本地项目引用的根节点。
  • global.json sdk:即用于构建的 sdk。新的 cli 还支持多个 sdk,我认为这仍然用于选择。

project.json

  • project.json 框架列表:我建议您阅读platform standard document,在那里您可以找到当前框架名称的列表。本文档还将解决您(可能)遇到的许多其他问题。 NuGet project docs 中有一个完整的列表,但该列表再次被弃用,也没有那么有用。您的示例 netcore 引用用于 UWP(运行时也称为 .NET Core),而跨平台 .NET Core 使用 netcoreapp,这在 NuGet 文档中完全缺失。
  • project.json 导入:你来这里的目的是错误的。在 project.json 中,您指定构建库实现的目标框架(例如 netstandard1.6net451)。 import 语句用于您为目标框架指定的依赖项,基本上说:如果引用的库中不存在 TFM(例如 netstandard1.6)(因为 NuGet 是前一段时间构建的),我也接受这些导入一次(例如已弃用的 dotnet5.6dnxcore50)。目前,这是一个打破 NuGet 并允许使用尚未移动到新 TFM 的库的实用程序。它没有说明您的项目,而是您接受使用哪些版本的依赖项。这需要为每个目标框架单独指定规范,因为每个目标框架对 NuGet 库实现的接受程度可能不同。
  • project.json 导入用法:嗯,使用你需要的并删除所有你不需要的。当您将尚未迁移到新 TFM 的 NuGet 引用时,您将收到错误消息。 dnxcoredotnet 是对 .NET Core 项目的押注,因为它们在当前绰号 netstandardnetcoreapp 被创造出来之前就已经被使用了。只是不要那么大胆地​​添加例如基于net461/mscorlib 的 NuGet 实现到基于netstandard/System.Runtime 的目标框架。这是行不通的,而且是一个常见的错误。

依赖项

  • dotnet 新默认模板:是的,对于 ASP.NET 和控制台应用程序,这始终是正确的选择。但是,这只是一个简单的控制台应用程序(Web 应用程序也是控制台应用程序)。使用 Visual Studio 在 Linux 下创建新的 ASP.NET Core 项目或 yeoman 进行高级模板。 dotnet new 不是一个成熟的脚手架系统。新模板使用netcoreapp 目标框架和Microsoft.NETCore.App 元包来导入基本上所有可用的基类库。如果要创建库,请切换到netstandard 目标框架并依赖NETStandard.Library。您仍然可以添加其他依赖项。对于 ASP.NET 核心,没有可用的直接元包。指导到此结束。有一个称为修剪的过程,您可以在其中删除这些元包并添加具体的依赖项。但目前还没有相应的工具。
  • project.json 构建/平台依赖项:build 依赖项本质上是工具,在构建期间不会发布。当您知道npm 时,您就知道此方案为devDependenciesplatform 依赖项本质上是一个依赖项,它不与您的应用程序一起部署,而是作为 .NET Core SDK 的共享基础安装的一部分。您可以在“便携式应用程序”(即platform)和“独立应用程序”(即没有)一词下找到guidance
  • project.json 元包/传递依赖:.NET Core 和 project.json 引入了元包的概念。 Microsoft.NETCore.App 本质上是 .NET Core 命令行应用程序的基线依赖项,NETStandard.Library 是类库的基线依赖项。所有这些包都可以有自己的代码和其他包的传递依赖项。这些你也可以使用。例如,Microsoft.NETCore.App 包引用了NETStandard.Library,它又引用了System.Collections.Generic。因此,在您引用 Microsoft.NETCore.App 的应用程序中,您可以使用通用集合。对于 ASP.NET Core,情况有所不同,因为按需付费的理念对性能非常关键。对于生产应用程序,您必须了解您添加的内容。作为初学者,您必须使用 VS 或 yeoman 之类的脚手架系统。 Microsoft.AspNetCore.Server.Kestrel(例如纯文本)或Microsoft.AspNetCore.Mvc(用于 Web api)可传递地包括大多数其他关键的 ASP.NET Core 依赖项。

免责声明:上面的大多数主题都与被视为“预览”的工具有关。 “预览版”的意思是“测试版”。即将发生重大变化(例如将构建系统从 project.json 切换回 msbuild,或再次完善 .NET 标准)。

我希望这能回答您的大部分问题。我认为在一个问题中回答所有问题是一项挑战;)。

【讨论】:

  • Tyvm,感谢您的深入回复!很快就会喝杯咖啡了:)
  • 这是一个很好的建议集合,谢谢。如果运气好的话,我会尝试从新的控制台应用程序中引用我的库。库使用netstandard1.6,应用使用netcoreapp1.0。但是dotnet restoreProject MYLIB is not compatible with netcoreapp1.0 (.NETCoreApp,Version=v1.0). Project MYLIB supports: netstandard1.6 (.NETStandard,Version=v1.6)。但是平台标准文档说netcoreapp1.0 映射到netstandard1.6。我应该在应用程序上添加import,还是更改库? (以及为什么有必要这样做?)。
  • 好吧,我想我已经解决了,但是 ugghh!.. 为什么netstandard1.5 有效但netstandard1.6 无效?如果“.NET Platform Standard”文档说它应该可以工作!
  • 当我尝试运行时,Expect required library hostpolicy.dll to be present in MYAPP\bin\Debug\netcoreapp1.0。我想我会做更多的谷歌搜索:'(
  • 使用 netstandard1.5。我猜平台规范文档也不是 100% 准确的。 netstandard1.6 将与 .NET Framework 4.6.3 保持一致……直到最早的 11 月初才发布。所以我敢打赌,在撰写本文时,这更像是一份规划文件。
猜你喜欢
  • 2018-07-16
  • 2016-10-24
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多