.Net Core迁移到MSBuild平台

一、前言

在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下新的项目配置文件中的节点配置,这篇我将用一些例子来详细讲下从project.json迁移到msbuild过程的节点配置。做过完整迁移新项目配置文件的朋友,肯定会觉得新的项目配置文件Msbuild的配置太扯了,虽然能直接编辑项目文件,但整个配置文件中没有了像project.json中的智能提示,当你在打开文件后你就会发现以前很轻松能写出来的json配置,现在已经什么都写不出来了,而且也没有文档可以参考,一般的情况下,往往开发人员就会关掉项目文件,打开NuGet管理器来进行包引用,但是这真的够用吗?不是所有的配置都能用可视化的方法来完成。

回到目录

二、XML定义

新的.csproj是基于xml格式的,下面介绍下project.json与.csproj文件的差异定义的例子:

项目名称 (ProjectName)

{"name": "MyProjectName"}

在csproj的配置中并没有对应的定义,它只会有项目文件名相同如:MyProjectName.csproj

程序集版本 (Version)

{"version": "1.0.0-alpha-*"}
<PropertyGroup><VersionPrefix>1.0.0</VersionPrefix><VersionSuffix>alpha</VersionSuffix></PropertyGroup>

当然也可以只使用Version来定义:

<PropertyGroup><Version>1.0.0-alpha</Version></PropertyGroup>

程序集描述

{"authors": [ "Anne", "Bob" ],"company": "Contoso","language": "en-US","title": "My library","description": "This is my library.\r\nAnd it's really great!","copyright": "Nugetizer 3000","userSecretsId": "xyz123"}
<PropertyGroup><Authors>Anne;Bob<Authors><Company>Contoso<Company><NeutralLanguage>en-US</NeutralLanguage><AssemblyTitle>My library</AssemblyTitle><Description>This is my library.
And it's really great!</Description><Copyright>Nugetizer 3000</Copyright><UserSecretsId>xyz123</UserSecretsId></PropertyGroup>

frameworks (单目标框架)

  "frameworks": {"netcoreapp1.0": {}}
<PropertyGroup><TargetFramework>netcoreapp1.0</TargetFramework></PropertyGroup>

frameworks (多目标框架)

 "frameworks": {"netcoreapp1.0": {},"net451": {}}
<PropertyGroup><TargetFrameworks>netcoreapp1.0;net451</TargetFrameworks></PropertyGroup>

dependencies (框架依赖)

"dependencies": {"Microsoft.AspNetCore": "1.1.0"}
<ItemGroup><PackageReference Include="Microsoft.AspNetCore" Version="1.1.0" /></ItemGroup>

不同目标框架的依赖 (Per-framework dependencies)

{"framework": {"net451": {"dependencies": {"System.Collections.Immutable": "1.3.1"}},"netstandard1.5": {"dependencies": {"Newtonsoft.Json": "9.0.1"}}}
}
<ItemGroup Condition="'$(TargetFramework)'=='net451'"><PackageReference Include="System.Collections.Immutable" Version="1.3.1" /></ItemGroup><ItemGroup Condition="'$(TargetFramework)'=='netstandard1.5'"><PackageReference Include="Newtonsoft.Json" Version="9.0.1" /></ItemGroup>

imports (兼容导入)

 {"dependencies": {"xxx": "1.0-pre001"},"frameworks": {"netcoreapp1.0": {"imports": ["dnxcore50","dotnet"]}}}
<PropertyGroup><PackageTargetFallback>dnxcore50;dotnet</PackageTargetFallback></PropertyGroup><ItemGroup><PackageReference Include="xxx" Version="1.0-pre001" /></ItemGroup>

依赖类型 (dependency type)

type: build

{"dependencies": {"Microsoft.EntityFrameworkCore.Design": {"version": "1.1.0","type": "build"}}}
<ItemGroup><PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.0" PrivateAssets="All" /></ItemGroup>

type: platform

{"dependencies": {"Microsoft.NETCore.App": {"version": "1.1.0","type": "platform"}}}

在*.csproj项目配置文件中没有对应的配置节点,只有目标框架定义:

<TargetFramework>netcoreapp1.1</TargetFramework>

之前想要编译出独立发布的可执行文件,就需要把 "type": "platform"节点删除掉。

独立发布定义 (runtimes)

{"runtimes": {"win7-x64": {},"osx.10.11-x64": {},"ubuntu.16.04-x64": {}}}
<PropertyGroup><RuntimeIdentifiers>win7-x64;osx.10-11-x64;ubuntu.16.04-x64</RuntimeIdentifiers></PropertyGroup>

现在想生成独立发布版本,只需要在项目配置中定义RuntimeIdentifiers节点,并运行如下命令:

dotnet publish --framework netcoreapp1.0 --runtime osx.10.11-x64

DOTNET CLI工具 (tools)

{"tools": {"Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-*"}}
<ItemGroup><DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" /></ItemGroup>

提示:tools下的引用,不再支持“imports”节点定义(不能兼容非dotnet core版本的tools)。

编译可执行 (emitEntryPoint)

{"buildOptions": {"emitEntryPoint": true}}
<PropertyGroup><OutputType>Exe</OutputType></PropertyGroup>
{"buildOptions": {"emitEntryPoint": false}}
<PropertyGroup><OutputType>Library</OutputType></PropertyGroup>

程序集强命名签名 (keyFile)

{"buildOptions": {"keyFile": "MyKey.snk"}}
<PropertyGroup><AssemblyOriginatorKeyFile>MyKey.snk</AssemblyOriginatorKeyFile><SignAssembly>true</SignAssembly><PublicSign Condition="'$(OS)' != 'Windows_NT'">true</PublicSign></PropertyGroup>

其它编译设置

{"buildOptions": {"warningsAsErrors": true,"nowarn": ["CS0168", "CS0219"],"xmlDoc": true,"preserveCompilationContext": true,"outputName": "Different.AssemblyName","debugType": "portable","allowUnsafe": true,"define": ["TEST", "OTHERCONDITION"]}}
<PropertyGroup><TreatWarningsAsErrors>true</TreatWarningsAsErrors><NoWarn>$(NoWarn);CS0168;CS0219</NoWarn><GenerateDocumentationFile>true</GenerateDocumentationFile><PreserveCompliationContext>true</PreserveCompliationContext><AssemblyName>Different.AssemblyName</AssemblyName><DebugType>portable</DebugType><AllowUnsafeBlocks>true</AllowUnsafeBlocks><DefineConstants>$(DefineConstants);TEST;OTHERCONDITION</DefineConstants></PropertyGroup>

打包设置 (packOptions)

{"packOptions": {"summary": "A bundle of cats","tags": ["hyperscale", "cats"],"owners": [ "Nate", "Jenna" ],"releaseNotes": "Version 1.0","iconUrl": "https://icons.com/awesomeness.png","projectUrl": "https://github.com/natemcmaster","licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0","requireLicenseAcceptance": false,"repository": {"type": "git","url": "https://github.com/natemcmaster/natemcmaster.github.io"}}}
<PropertyGroup><Description>A bundle of cats</Description><PackageTags>hyperscale;cats</PackageTags><PackageReleaseNotes>Version 1.0</PackageReleaseNotes><PackageIconUrl>https://icons.com/awesomeness.png</PackageIconUrl><PackageProjectUrl>https://github.com/natemcmaster</PackageProjectUrl><PackageLicenseUrl>https://www.apache.org/licenses/LICENSE-2.0</PackageLicenseUrl><PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance><RepositoryType>git</RepositoryType><RepositoryUrl>https://github.com/natemcmaster/natemcmaster.github.io</RepositoryUrl><!-- regrettably, 'owners' does not translate to MSBuild. --></PropertyGroup>

MsBuild脚本

{"scripts": {"precompile": "generateCode.cmd","postpublish": [ "obfuscate.cmd", "removeTempFiles.cmd" ]}}
<Target Name="MyPreCompileTarget" BeforeTargets="Build"><Exec Command="generateCode.cmd" /></Target><Target Name="MyPostCompileTarget" AfterTargets="Publish"><Exec Command="obfuscate.cmd" /><Exec Command="removeTempFiles.cmd" /></Target>

运行时设置 (runtimeOptions)

{"runtimeOptions": {"configProperties": {"System.GC.Server": true,"System.GC.Concurrent": true,"System.GC.RetainVM": true,"System.Threading.ThreadPool.MinThreads": 10,"System.Threading.ThreadPool.MaxThreads": 100}}}
<PropertyGroup><ServerGarbageCollection>true</ServerGarbageCollection><ConcurrentGarbageCollection>true</ConcurrentGarbageCollection><RetainVMGarbageCollection>true</RetainVMGarbageCollection><!-- I'm not suggesting these settings...just showing usage ;) --><ThreadPoolMinThreads>10</ThreadPoolMinThreads><ThreadPoolMaxThreads>100</ThreadPoolMaxThreads></ProeprtyGroup>

当然如果你创建的是一个web项目的话,及Microsoft.NET.Sdk.Web。那么 ServerGarbageCollection设置将默认为true。

项目文件管理

{"buildOptions": {"compile": {"copyToOutput": "notes.txt","include": "../Shared/*.cs","exclude": "../Shared/Not/*.cs"},"embed": {"include": "../Shared/*.resx"}},"packOptions": {"include": "Views/","mappings": {"some/path/in/project.txt": "in/package.txt"}},"publishOptions": {"include": ["files/","publishnotes.txt"]}}
<ItemGroup><Compile Include="..\Shared\*.cs" Exclude="..\Shared\Not\*.cs" /><EmbeddedResource Include="..\Shared\*.resx" /><Content Include="Views\**\*" PackagePath="%(Identity)" /><None Include="some/path/in/project.txt" Pack="true" PackagePath="in/package.txt" /><None Include="notes.txt" CopyToOutputDirectory="Always" /><!-- CopyToOutputDirectory = { Always, PreserveNewest, Never } --><Content Include="files\**\*" CopyToPublishDirectory="PreserveNewest" /><None Include="publishnotes.txt" CopyToPublishDirectory="Always" /><!-- CopyToPublishDirectory = { Always, PreserveNewest, Never } --><!-- you can set both copy output and publish directories--><None Include="testasset.txt" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" /><!-- alternatively, use nested XML attributes. They're functionally the same--><None Include="testasset2.txt"><CopyToOutputDirectory>Always</CopyToOutputDirectory><CopyToPublishDirectory>Always</CopyToPublishDirectory></None></ItemGroup>

单元测试

xunit

{"testRunner": "xunit","dependencies": {"dotnet-test-xunit": "<any>"}}
<ItemGroup><PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" /><PackageReference Include="xunit" Version="2.2.0" /><PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" /></ItemGroup>

mstest

{"testRunner": "mstest","dependencies": {"dotnet-test-mstest": "<any>"}}
<ItemGroup><PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" /><PackageReference Include="MSTest.TestAdapter" Version="1.1.12" /><PackageReference Include="MSTest.TestFramework" Version="1.1.11" /></ItemGroup>

回到目录

三、结语

说实话MSBuild的项目配置系统还是比较灵活的,以后整个dotnet体系的构建过程也都得到了统一。在dotnet cli中也集成了msbuild,即dotnet build。

原文地址:http://www.cnblogs.com/maxzhang1985/p/6550001.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

青鸟IT汇微信公众号新增智能机器人

这么神奇的吗&#xff1f;居然可以智能小机器人无休止的聊天&#xff1f; 各位粉丝大家好&#xff0c;青鸟IT汇于2018年5月7日新加智能小机器人&#xff0c;粉丝们可以进行互动啦~~ 比如说&#xff1a; 或者这个样子的&#xff1a; 还有这个样子的&#xff1a; 偶尔的调戏…

2015蓝桥杯省赛---java---C---2(立方尾不变)

题目描述 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {int sum0;for (int i 1; i < 10000; i) {String ai"";String b(long)(Math.pow(i,3))"";String cb.substring…

java人脸识别更新:摄像头支持360、火狐和谷歌浏览器

本次更新内容&#xff1a;打开摄像头在原有的火狐基础上新加360浏览器个谷歌浏览器&#xff0c;IE暂且不支持在index.js中&#xff0c;将这段代码&#xff1a;// 支持浏览器 谷歌,火狐,360,欧朋//navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianowif …

使用 Angular

N。正如上个月提到的&#xff0c;现在可以开始处理 MEAN 堆栈的前端。也就是说&#xff0c;我们将深入探究 Angular。自本文撰写之时起&#xff08;可能在今后的几年间&#xff09;&#xff0c;我们都会面临一个问题&#xff0c;即 Angular 存在某种版本问题。 Angular 多年来一…

php公告滚动源码,10行js代码实现上下滚动公告效果方法

本文主要给大家介绍了关于利用10行js代码实现滚动公告效果的相关资料&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起看看吧。希望能帮助到大家。需求在最近的项目中需要实现公…

MySQL left()函数

转载自 MySQL left()函数 MySQL LEFT函数介绍 LEFT()函数是一个字符串函数&#xff0c;它返回具有指定长度的字符串的左边部分。 下面是LEFT()函数的语法 - LEFT(str,length);LEFT()函数接受两个参数&#xff1a; str是要提取子字符串的字符串。length是一个正整数&…

2020蓝桥杯省赛---java---B---10(整数小拼接)

题目描述 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int k sc.nextInt();int[] array new int[n];for (int i 0; i < n; i…

[ASP.NET Core] Middleware

前言 本篇文章介绍ASP.NET Core里&#xff0c;用来处理HTTP封包的Middleware&#xff0c;为自己留个纪录也希望能帮助到有需要的开发人员。 ASP.NET Core官网 结构 在ASP.NET Core里&#xff0c;每个从「浏览器传入」的HTTP Request封包&#xff0c;会被系统封装为「HttpReques…

2015蓝桥杯省赛---java---C---6(奇妙的数字)

题目描述 思路分析 看到这题目想到的就是 for 循环遍历数字&#xff0c;然后计算它的平方和立方再去判断它们刚好使用0-9这10个数各一次。 代码实现 package com.kuang.study.lanqiao;/*** 创建人 wdl* 创建时间 2021/4/8* 描述*/ public class Main {public static void ma…

MySQL substring()函数

转载自 MySQL substring()函数 在本教程中&#xff0c;我们将向您介绍MySQL SUBSTRING函数从字符串中提取子字符串。 SUBSTRING函数从特定位置开始的字符串返回一个给定长度的子字符串。 MySQL提供了各种形式的子串功能。 我们将在以下部分中检查SUBSTRING函数的每种形式。…

跨平台的.NET邮件协议MailKit组件解析

发起的.NET Core开源组织号召&#xff0c;进展的速度是我自己也没有想到的&#xff0c;很多园友都积极参与&#xff08;虽然有些人诚心砸场子&#xff0c;要是以我以前的宝脾气&#xff0c;这会应该被我打住院了吧&#xff0c;不过幸好是少数&#xff0c;做一件事总有人说好&am…

2015蓝桥杯省赛---java---C---9(打印大X)

题目描述 思路分析 找规律 代码实现 package com.kuang.study.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int x sc.nextInt();int y sc.nextInt();char [][] arr new char[y][y…

老司机实战Windows Server Docker:1 初体验之各种填坑

前言 Windows Server 2016正式版发布已经有近半年时间了&#xff0c;除了看到携程的同学分享了一些Windows Server Docker的实践经验&#xff0c;网上比较深入的资料&#xff0c;不管是中文或英文的&#xff0c;都还不太多。工作中对Windows Server 2016下的Docker&#xff0c…

.NET Core项目从xproj+project.json向csproj迁移简介

3月7日&#xff0c;微软发布了Visual Studio 2017 RTM&#xff0c;与之一起发布的还有.NET Core Runtime 1.1.0以及.NET Core SDK 1.0.0&#xff0c;尽管这些并不是最新版&#xff0c;但也已经从preview版本升级到了正式版。所以&#xff0c;在安装Visual Studio 2017时如果启用…

马踏棋盘算法(骑士周游)+贪心优化

思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util.Comparator;public class HorseChessboard {private static int x;//棋盘的列数private static int y;//棋盘的行数//创建一个数组&#xff0c;标记棋盘的各个…

MySQL format()函数

转载自 MySQL format()函数 MySQL FORMAT函数简介 有时&#xff0c;您使用表达式或聚合函数(如AVG)来计算数据库中的值&#xff0c;例如库存周转率&#xff0c;产品的平均价格&#xff0c;平均发票值等。 表达式的结果是十进制数&#xff0c;并带有许多小数位。要格式化这…

马踏棋盘算法(骑士周游)

思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util.Comparator;public class HorseChessboard {private static int x;//棋盘的列数private static int y;//棋盘的行数//创建一个数组&#xff0c;标记棋盘的各个…

开源免费的.NET图像即时处理的组件ImageProcessor

承接以前的组件系列&#xff0c;这个组件系列旨在介绍.NET相关的组件&#xff0c;让大家可以在项目中有一个更好的选择&#xff0c;社区对于第三方插件的介绍还是比较少的&#xff0c;很多博文的内容主要还是介绍一些简单的操作&#xff08;很多人都说博客园现在是“hello worl…

人脸识别活体检测测试案例

最近好多人找我要关于人脸识别活体检测的案例&#xff0c;今天正好有空我就更新一下&#xff0c;先解释一下活体&#xff0c;顾名思义就是看看是否是活人在测检&#xff08;大白话解说&#xff09;&#xff0c;用技术上的话也就是看看当前操作者是否是在用照片或者其他方法来操…

2016蓝桥杯省赛---java---B---1(有奖猜谜)

题目描述 思路分析 方案一 直接计算器(有手就行的题) 方案二 package com.kuang.study.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {int x777;String str"vxvxvxvxvxvxvvx";for (int i 0; i < str.length()…