2016-12-13 Hutchinson 微软中国MSDN
在 11 月举行的 Connect(); 上,Microsoft 将推出 Visual Studio for Mac 预览版。这是一个激动人心的进展,将以移动为中心的 Xamarin Studio IDE 发展成为真正的移动先行和云优先的 .NET 和 C# 开发工具,并为 Mac 带来 Visual Studio 开发体验。
Visual Studio 系列的新成员
从本质上说,Visual Studio for Mac 是与 Windows 版 Visual Studio 对应的 macOS 版本。如果你很喜欢 Visual Studio 开发体验,但又需要或想使用 macOS 的话,就应该不会感到陌生。
尽管其用户体验源于 Visual Studio 的启发,但在设计上看上去就像专为 macOS 量身打造的一样。与 Windows 版的 Visual Studio 类似,在不需要完整的 IDE 但需要轻型而丰富的独立源代码编辑器时,也可使用 Visual Studio Code 对其进行补充。
实际上,Visual Studio for Mac 还与 Visual Studio 系列中的同级产品有很多共同之处。例如,它也使用 Roslyn 编译器平台支持 IntelliSense 和重构功能;并同样在项目系统和生成引擎中使用 MSBuild;而且其源代码编辑器也支持 TextMate 捆绑包。
对于 Xamarin 和 .NET Core 应用,使用的是同样的调试器引擎,而且对于 Xamarin.iOS 和 Xamarin.Android 使用的是相同的设计器。
兼容性是 Visual Studio for Mac 的一个重要关注点。尽管它是一个新产品,暂时还无法支持所有 Visual Studio 项目类型,但对于确实可支持的那些项目类型,它使用相同的 MSBuild 解决方案和项目格式。
如果你的团队中既有人使用 macOs 又有人使用 Windows,或你自己在两个 OS 之间切换,则可以无缝地跨平台共享项目。无需执行任何转换或迁移操作。
移动先行和云优先开发
Visual Studio for Mac 支持的主要工作负载是通过 Xamarin 进行原生 iOS、Android 和 Mac 开发,以及通过 .NET Core 与 Azure 集成进行服务器开发。它提供了这两个开发场景所需要的所有工具,可帮助你开发当今用户所期望的众多原生移动应用体验,以及为这些体验提供强力支持的基于云的服务器后端。
所有这些开发都采用你熟悉并喜爱的 C# 语言,而且是最新的工作效率更高的 C# 7。
你不仅可获得编译型代码更好的性能、现代的类型安全语言所带来的工作效率、对每个平台独特功能的访问,而且还可以充分利用丰富生态系统中的库和工具。可以跨移动域和云域使用现有的体验,在客户端与服务器之间共享代码。对于一个解决方案中的所有项目,可以利用解决方案级的跨项目重构和代码导航。
在 Visual Studio for Mac 预览版中,C# 不是唯一支持的语言。对于你们当中的函数式程序员,它通过在 Visual Studio 中使用相同的 F# 编译器,可以提供卓越的 F# 支持。
iOS、Android 和 Mac
对于当今碎片化的移动市场,能够支持各种设备显得尤为重要。由于 Visual Studio for Mac 是基于 Xamarin Studio 的,因此,对采用 Xamarin 平台基于 C# 开发 iOS、Android 和 Mac 应用的支持是久经考验的。你可以利用现有的 C# 经验和库,跨平台共享通用代码,完全访问本机 API,因此,可以打造出快速、可媲美本机应用体验的应用。
要实现更广泛的代码共享,可以使用跨平台的 Xamarin.Forms UI 库,Visula Studio for Mac 提供了熟悉的基于 XAML 的开发环境,可以面向多平台,包括 iOS、Android、macOS 和通用 Windows 平台 (UWP) - 尽管 Visual Studio 当前仅支持 UWP 开发,并映射到每个平台上的本机 UI。
当需要更多控制时,可以将 Xamarin.Forms 与可直接访问的本机工具包混合搭配使用。另外,通过 NuGet 还提供了大量可用于 Xamarin 的库生态系统,其中包括平台特定的库、到本机代码的绑定和可移植的 .NET Standard 库。
与 Visual Studio 一样,Visual Studio for Mac 也提供了拖放式设计器,可以在 iOS 和 Android 开发中使用它快速组装和微调 UI。
对于 Xamarin.Forms,它提供了丰富的 XAML IntelliSense 和并行实时预览功能,如图 1 所示。设计器和实时预览都可使用模拟器精确呈现应用将在实际运行设备上的显示效果,即使你的自定义控件也可以支持。
图 1 Xamarin.Forms XAML 实时预览
为云量身定制
几乎每个移动应用的背后都有一个为其提供支持的服务,Visual Studio for Mac 支持最新的 ASP.NET Core Web 开发平台,让你能够轻松开发自己的应用服务。ASP.NET Core 运行于 .NET Core 上,后者是 .NET Framework 和运行时的最新发展。
它经过调优,可提供极快的性能,进行分解后,更便于小规模安装,且经过重新构思设计,可在 Linux 和 macOS 以及 Windows 上运行。
.NET Core 提供了前所未有的巨大灵活性,让你可以随时随地开发和部署自己的服务器应用程序,无论是在自己的数据中心还是 Microsoft Azure 等云平台上。由于 .NET Core 和 Xamarin 平台都是开源的,因此,不必担忧被供应商绑架。
此外,Visual Studio for Mac 对 .NET Core 项目的支持也使你能够编写 .NET Standard 库,这是未来跨 .NET 平台共享代码的一种新方式。.NET Standard 库取代了可移植类库 (PCL),提供了覆盖范围更广的 API。由于 .NET Core 和 Xamarin 平台都是遵循 .NET Standard 的,因此,你可以使用它们在你的解决方案中和通过 NuGet 程序包管理器共享代码。
熟悉的工作区
Visual Studio for Mac 工作区对于现有 Visual Studio 开发人员来说应该是熟悉的。首次打开时,会看到一个欢迎页面,其中包含最近打开的解决方案列表,开发人员新闻动态,以及可帮助你快速入门的其他信息。
要创建新解决方案,请转至“文件”菜单,选择“新建项目”,之后,将显示包含新解决方案的工作区。如图 2 所示,处于中心位置的是一个选项卡式源代码编辑器,周围是一些其他停靠窗口或“面板”,例如“解决方案”、“输出”、“属性”、“文档大纲”和“工具箱”。与 Visual Studio 一样,这种布局可高度定制,并可根据你当前是在编码、调试还是在使用拖放式设计器,进行自动切换。
图 2 Visual Studio for Mac 工作区
工具栏也是非常熟悉的,但也有一些明显的差别:
左侧是“运行”按钮、从中选择“活动配置”的下拉列表,以及从中选择“运行配置”和“目标设备”的下拉列表。对于跨平台移动开发,通过下拉列表能够轻松切换在上面测试或调试应用程序的设备或模拟器。“运行配置”与 Visual Studio 中的启动项目类似,除了能够切换运行的项目之外,还可以为运行选项集创建自定义名称。
工具栏的中心位置是通知区域,其中显示有关各种操作(例如,生成或还原 NuGet 程序包)的消息。当有操作正在运行时,通知区域中会出现一个取消按钮。有关软件更新的通知也显示在通知区域中。有些通知你可以直接单击,例如生成错误,可显示提供更多信息的面板。
在工具栏的右侧是全局搜索。除了帮助你在解决方案中查找命令和文件之外,它的 camelCase 筛选系统还使其成为快速激活命令或跳转至解决方案中的文件或类型的极好方法。它甚至还可以在解决方案中启动“在文件中查找”搜索,或打开 NuGet 程序包管理器以搜索包。
“解决方案”面板的工作方式与 Visual Studio 中的“解决方案资源管理器”基本相同,可以方便地浏览和管理解决方案以及其中项目和文件的结构。上下文菜单会根据在解决方案树中选择的项提供各种上下文特定的命令,例如,在项目中添加或删除文件,编辑项目引用,在文件夹中打开终端窗口,以及生成或调试特定项目。
“错误”面板会显示任何生成警告和错误,在拆分视图中还可以看到生成日志输出。与 Visual Studio 不同,没有一个统一的面板来显示所有类型的输出。例如,“应用程序输出”面板会显示运行或调试应用程序时来自应用的输出,NuGet 操作日志会显示在“NuGet 控制台”面板。“属性”面板会根据上下文显示当前专注并选中的任何内容的属性,可用于查看和更改解决方案面板中的文件生成操作。
源代码编辑器是整个 IDE 的中心,包含可从 Visual Studio 系列成员获得的所有功能。图 3 显示 .NET Core 项目中的 C# IntelliSense 语法突出显示。还有代码折叠、键入时用下划线实时进行错误提醒和建议提示、可配置的自动格式设置、代码导航命令和一系列强大的重构工具。
图 3 .NET Core 项目中的 IntelliSense
默认情况下,并不会启用编辑器的所有功能。可从 Mac 应用程序菜单中,打开“首选项”对话框,调整 Visual Studio for Mac 设置。这相当于 Visual Studio“工具”菜单中的“选项”对话框,其中包含很多选项,供你按需自定义 IDE。
对单元测试使用 NUnit 进行支持,其他测试运行程序可通过扩展插入。程序集中发现的测试会显示在“单元测试”面板中,该面板可从“查看 | 面板”菜单进行访问。在源代码编辑器中也集成了 Git 版本控制,在编辑器底部显示有一行选项卡,可以访问当前文件的日志、差异和责任视图。
如果希望利用更多的提示和技巧快速进入状态,建议从 Xamarin Evolve 2016 观看我的“Become a Xamarin Studio Expert(成为 Xamarin Studio 专家)”讲座 (xmn.io/xs-expert),因为这个讲座内容正好适用于 Visual Studio for Mac。
开源的内核
与 Xamarin Studio 一样,Visual Studio for Mac 是基于开源的 MonoDevelop IDE(这也是 Microsoft 积极开发的开源项目)。它完全采用 C# 编写,具有强大的可扩展性模型,从简单的编辑器命令到全新的语言和项目类型,都可以通过扩展来添加功能性。即使已有核心功能,例如 C# 编辑,对 Xamarin.iOS、Xamarin.Android 和 ASP.NET Core 的支持也都是通过扩展实现。
与 Visual Studio 和 Visual Studio Code 一样,Visual Studio for Mac 中对 C# 的支持也是基于开源 Roslyn 编译器平台实现的。你可拥有与使用 Visual Studio 时完全相同且熟悉的 IntelliSense 体验,并且支持编辑器中实时分析器和代码修复。Visual Studio for Mac 甚至还默认包括分析器和代码修复的 Refactoring Essentials 集合。
借助 TextMate 捆绑包提供语法突出显示和简单的 IntelliSense,Visual Studio for Mac 可支持编辑各种语言。它包括了来自 Visual Studio Code 的大量开源 TextMate 捆绑包。
创建 ASP.NET Core 应用
为了展示使用 Visuao Studio for Mac 加速开发是多么容易,接下来我会创建一个简单的 ASP.NET Core 后端进行演示。它用于一个假想的“共享待办事项列表”移动应用,允许多个用户添加事项,只要其中任何一个用户发布事项,所有用户都可以看到。
请注意,我在撰写本文时使用的是 Visual Studio for Mac 预发布版,UI 的一些细节在发布版中可能会有所变动。但是,本文介绍的方法和概念仍是适用的。
安装并打开 Visual Studio for Mac 后,首先在欢迎页面上单击“新建解决方案”按钮,这会打开“新建项目”对话框。
之后,导航到“云”部分,选择“ASP.NET Core Web 应用程序”模板,单击“下一步”,然后选择“Web API”模板。“Web API”模板会创建一个 RESTful Web 服务,这是适用于移动后端的首选接口方式,不过你也可以稍后向项目中添加视图以创建 Web 前端。
最后,我将项目命名为 HelloVSMac,并单击“创建”。Visual Studio for Mac 使用 .net 模板引擎创建项目,打开项目,并开始还原项目所依赖的 NuGet 程序包。
如果使用解决方案面板中项目上的“工具 | 编辑文件”上下文菜单在编辑器中打开项目文件,则会看到它是一个便于理解的基于 MSBuild 的简单项目文件。如果直接对其编辑并保存,则 IDE 将自动重新加载经过修改的版本。
接下来在解决方案面板中看一下项目,关键项包括:
程序包: 项目的 NuGet 程序包依赖项。生成项目的 ASP.NET Core、.NET Core 框架和 MSBuild 目标都通过 NuGet 程序包进行安装。
Program.cs: Web 应用的入口点。ASP.NET Core 应用是程序,因此,有一个主要方法入口点,用于在应用核心创建、生成和运行 WebHost。
Startup.cs: 用于定义传递至 WebHost 的 Startup 类。该类包含应用程序的初始化方法。
appsettings.json: 应用的配置设置。这是 ASP.NET web.config 的 ASP.NET Core 等效项。
出于演示目的,所有这些将不做改动,下面看一下 Views 文件夹中的 ValuesController.cs 文件。该文件包含在 [Route("api/[controller]")] 路由上注册的 ValuesController 类。[controller] 是类名称的占位符,因此实际上是 api/values 路由。
我先定义一个非常简单的 ToDoItem 类和一个 ToDoList 存储类。ToDoList 是静态的,因此可以在请求之间共享。
在实际应用中,会使用一个数据库,但目前就先这样吧。我还将 controller 类重命名为 ToDoController(使路由变为 api/todo),将 Get 和 Post 方法连接至存储,并清除其他未使用的 controller 方法。结果如图 4 所示。
图 4 Controller 及其简单的共享待办事项列表存储
[Route("api/[controller]")]
public class ToDoController : Controller { [HttpGet] public IEnumerable<ToDoItem> Get() { return ToDoList.GetAll(); } [HttpPost] public void Post([FromBody]ToDoItem item) { ToDoList.Add(item); } }
public class ToDoItem { public string Title { get; set; } }
public static class ToDoList { static List<ToDoItem> list = new List<ToDoItem>(); public static void Add(ToDoItem item) { lock (list) { list.Add(item); } } public static IEnumerable<ToDoItem> GetAll() { lock (list) { return list.ToArray(); } } }
现在,我们实现了一个完整但非常小的 RESTful Web 服务。让我们来试一试。
我在 Post 方法中放置一个断点,然后开始调试应用。应用启动时,“输出”面板开始显示 ASP.NET Core 内置 Kestrel Web 服务器的输出,输出端口默认采用 5000,但它在收到请求之前不会执行任何其他操作。
可以打开 Web 浏览器,访问 127.0.0.1:5000/api/todo,但此刻返回的只是一个空数组。
图 5 调试 .NET Core 项目
由于现在并没有一个针对该服务的移动客户端,因此,需要打开 macOs 终端应用,使用 curl 向应用发送一个 POST 请求:
$ curl -H "Content-type: application/json" -X POST -d '{ title: "build mobile app" }' 127.0.0.1:5000/api/todo
这会触发调试器中的断点。可以检查自动从请求的 JSON 主体解析并转换为 ToDoItem 对象的值。你会看到 Visual Studio for Mac 自动进入调试布局,并提供了所期望的所有调试器面板: 堆栈、局部、线程、断点等等。
现在,返回到终端,使用 curl 访问 Get 方法,你会看到 JSON 数组包含了刚刚添加的项。
$ curl 127.0.0.1:5000/api/todo [{"title":"build mobile app"}]
下一步是生成移动应用,就请你自行进行探索吧。如需更深入了解有关 ASP.NET Core 的信息,建议访问asp.net/get-started;如需了解有关 Xamarin 开发的更多信息,请访问 developer.xamarin.com,其中提供了大量有价值的资料供你参考。尽管有关 Visual Studio for Mac 的文档还不多,但 Xamarin Studio 文档恰好适用于大多数情况,Visual Studio 文档通常也适用。
总结
我希望这篇简介能够经引发你试用 Visual Studio for Mac 的兴趣,使其成为你进行云端和移动端开发的优选 macOS IDE! 如果你有 Mac,建议从 VisualStudio.com 下载预览版,试试看,让我们知道你的看法。我们很高兴听到你的反馈,以帮助在预览版及其之后版本中提供指导。