.Net Core迁移到MSBuild的多平台编译问题
一、前言
本篇主要讨论.NET Core应用程序项目结构的主题,重点探索.NET Core应用程序的多平台编译问题,这里指的多平台是指.NET Framework、.NET Core App、.NET Standard、Mono、UWP等多平台的条件编译、项目(包)引用、编译符号等问题。
.NET Core已经将新的项目管理配置过渡回MSBuild编译系统中。虽然现在可以从无到有的使用VS2017来创建一个新的MSBuild项目,但是还是有好多遗留程序使用着以JSON格式存储的项目配置文件为基础的项目。Scott Hanselman也在博客中发文教大家怎么使用新的.NET SDK RC4工具将project.json转换到MSBuild的.csproj项目系统。当然这篇文章也解释了MS为什么要这么做。
MSBuild 是一种基于 XML 的项目文件格式的项目配置文件。这种格式容易理解、易于扩展并且完全受 Microsoft 支持。MSBuild 项目文件的格式使开发人员能够充分描述哪些项需要生成,以及如何利用不同的平台和配置生成这些项。另外,项目文件的格式还使开发人员能够创作可重用的生成规则,这些规则可以分解到不同的文件中,以便可以在产品内的不同项目之间一致地执行生成。
当时ASP.NET Core的第一个版本为了使开源平台对开发者更具吸引力,ASP.NET Core采用了一种基于JSON的项目系统project.json文件定义,这是一种与Node.js类似的定义,这对于吸引Web开发者来说是个明智的选择。但是随着.NET Core的整体开源,非Web开发者如UWP和Xamarin,对这种JSON项目结构并不熟悉。这些开发者和社区都希望继续使用MSBuild的XML项目系统。因些微软宣布他们将为.NET Core重新启用和规范MSBuild构建系统。在最新的.NET Core SDK 1.0 RC4 版本中,dotnet cli(命令行接口,dotnet cli 1.0.0-preview3-004056及以后版本)已经包含了”dotnet migrate”命令,这个命令为了将JSON为基础的配置项目转换为.csproj项目配置文件。
本文不再谈论如何使用新dotnet cli命令行,而卓重讨论多平台编译问题。
二、定义多平台
project.json
在project.json项目配置中定义多平台,使用的是”frameworks”节点来配置的,并且在每个平台节点下也配置了对应的项目引用或依赖。
下面的实例使用project.json定义的多平台和依赖如下:
"frameworks": {
"net451": {
"frameworkAssemblies": {
"System.Xml": "4.0.0.0",
}
},
"netstandard1.6": {
"dependencies": {
"System.Runtime":"4.1.0",
"System.Xml.XmlSerializer": "4.0.11"
},
}
}
MSBuild
在.csproj项目配置中定义多平台,要使用”TargetFrameworks”的XML节点来配置:
<TargetFrameworks>netstandard1.;net45;</TargetFrameworks>
如果要定义某个平台下的依赖引用的话需要如下定义:
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.6' ">
<PackageReference Include="System.Xml.XmlSerializer" Version="4.0.11"/>
</ItemGroup>
当然有时候我们还需要对某个平台定义,定义编译符号常量:
<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard1.6'">
<DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
</PropertyGroup>
这些代码中就可以针对平台特性来编写代码了:
#if NETSTANDARD
//netstandard1.*平台代码
#endif
如果我们想在某个平台下,只编译某些文件,也是可以实现的:
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
<Compile Include="Platforms\net45\*.cs" />
</ItemGroup>
三、结语
说实话MSBuild的项目配置系统还是比较灵活的,以后整个dotnet体系的构建过程也都得到了统一。在dotnet cli中也集成了msbuild,即dotnet build。
GitHub:https://github.com/maxzhang1985/YOYOFx 如果觉还可以请Star下, 欢迎一起交流。
.NET Core 开源学习群:214741894
.Net Core迁移到MSBuild的多平台编译问题的更多相关文章
- .Net Core迁移到MSBuild平台(二)
一.前言 在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下新的项目配置文件中的节点配置,这篇我将用一些例子来详细讲下从project.json迁移到msbuild过程 ...
- Net Core迁移到MSBuild
Net Core迁移到MSBuild平台(二) 阅读目录 一.前言 二.XML定义 三.结语 回到目录 一.前言 在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下 ...
- .net core迁移实践:项目文件csproj的转换
随着net core的不断更新和生产可用,越来越多的人把现有的应用迁移和部署到net core平台.本文将分享迁移过程中的一个环节,给大家做一下参考. 背景说明 先来介绍一下什么是SDK样式的文件结构 ...
- EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
前言 终于踏出第一步探索EF Core原理和本质,过程虽然比较漫长且枯燥乏味还得反复论证,其中滋味自知,EF Core的强大想必不用我再过多废话,有时候我们是否思考过背后到底做了些什么,到底怎么实现的 ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- EntityFramework Core迁移时出现数据库已存在对象问题解决方案
前言 刚开始接触EF Core时本着探索的精神去搞,搞着搞着发现出问题了,后来就一直没解决,觉得很是不爽,借着周末好好看看这块内容. EntityFramework Core迁移出现对象在数据库中已存 ...
- 大数据平台Hive数据迁移至阿里云ODPS平台流程与问题记录
一.背景介绍 最近几天,接到公司的一个将当前大数据平台数据全部迁移到阿里云ODPS平台上的任务.而申请的这个ODPS平台是属于政务内网的,因考虑到安全问题当前的大数据平台与阿里云ODPS的网络是不通的 ...
- NET Core迁移
向ASP.NET Core迁移 有人说.NET在国内的氛围越来越不行了,看博客园文章的浏览量也起不来.是不是要转Java呢? 没有必要扯起语言的纷争,Java也好C#都只是语言是工具,各有各的 ...
- 如何通过RMAN使用传输表空间迁移到不同的Endian平台 (Doc ID 371556.1)
How to Migrate to different Endian Platform Using Transportable Tablespaces With RMAN (Doc ID 371556 ...
随机推荐
- linux下启动tomcat----Cannot find ./catalina.sh
参考:http://dearseven.blog.163.com/blog/static/1005379222013764440253/ linux 下启动tomcat [root@test233 b ...
- Python3基础 使用id() 查询变量的存储位置
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- JS判断doctype文档模式-document.compatMode
IE对盒模型的渲染在 Standards Mode和Quirks Mode是有很大差别的,在Standards Mode下对于盒模型的解释和其他的标准浏览器是一样,但在Quirks Mode模式下则有 ...
- mysql 用户管理 权限控制
添加用户 insert into mysql.user(Host,User,Password) values("%","shenen",password(&qu ...
- Selenium2(java)框架设计 九
设计框架原则: 数据分离,业务层和逻辑层不要混杂在一起. 设计图: 框架结构初始化: com.wymall.test:这是存放这个框架源代码的根目录 base:里面有个基类(BaseParpaare. ...
- iOS 之 socket 与 http
http连接:短连接,发送一次请求,服务器响应后连接就断开. socket连接:长连接,连接后长期保持连接状态.
- 报错找不到jquery-1.10.2.min.map解决办法
http://fruithardcandy.iteye.com/blog/1941452
- Bootstrap 按钮分组
Bootstrap 按钮分组: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- jQuery实践-别踩白块儿网页版
▓▓▓▓▓▓ 大致介绍 终于结束了考试,放假回家了.这次的别踩白块儿网页版要比之前做的 jQuery实践-网页版2048小游戏 要简单一点,基本的思路都差不多. 预览:别踩白块网页版 这篇博客并不是详 ...
- 【JAVA笔记】JAVA后端实现统一扫码支付:微信篇
最近做完了一个项目,正好没事做,产品经理就给我安排了一个任务. 做一个像收钱吧这样可以统一扫码收钱的功能. 一开始并不知道是怎么实现的,咨询了好几个朋友,才知道大概的业务流程:先是开一个网页用 ...