2019-7-2-Roslyn-开发-NuGet-包的-Task-编译可能遇到的问题
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
Roslyn 开发 NuGet 包的 Task 编译可能遇到的问题
|
lindexi
|
2019-07-02 10:43:28 +0800
|
2019-7-2 10:30:1 +0800
|
在写 msbuild 脚本的时候,或修改项目文件的时候,将会使用到很多的微软提供的 Task 命令。在需要复杂的编译的时候,可以通过自己定义一个任务用来定义编译
如何入门开发请看 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 - walterlv 本文只会补充一些开发的过程会遇到的坑
版本选择
开发的 Task 需要引用以下两个库
- Microsoft.Build.Framework
- Microsoft.Build.Utilities.Core
这也就默认要求使用 .NET Framework 4.7.2 和 .NET Standard 2.0 以上
判断当前编译器平台
在跨平台的开发可能用户使用的是 dotnet core 版本,于是需要一个 dotnet core 版本的 Task 让他进行编译
使用下面代码可以判断当前点编译器是运行在哪个平台
'$(MSBuildRuntimeType)' == 'Core'
如果上面代码返回 true 那么编译器是 dotnet core 平台
以上面代码判断可以写出对使用 dotnet core 和 .NET Framework 两个平台的不同的程序集文件
调用方法
假定在程序集 UsingMSBuildCopyOutputFileToFastDebug.dll 里面包含 UsingMSBuildCopyOutputFileToFastDebug.SafeOutputFileCopyTask 类,这个类继承 Task 类
而 UsingMSBuildCopyOutputFileToFastDebug.dll 存放在 NuGet 包的 AssemblyFile 属性下,这个属性的定义请看代码
<PropertyGroup>
<!-- 我们使用 $(MSBuildRuntimeType) 来判断编译器是 .NET Core 的还是 .NET Framework 的。
然后选用对应的文件夹。-->
<NuGetUsingMSBuildCopyOutputFileToFastDebugTaskFolder Condition=" '$(MSBuildRuntimeType)' == 'Core'">$(MSBuildThisFileDirectory)..\tools\netcoreapp2.2\</NuGetUsingMSBuildCopyOutputFileToFastDebugTaskFolder>
<NuGetUsingMSBuildCopyOutputFileToFastDebugTaskFolder Condition=" '$(MSBuildRuntimeType)' != 'Core'">$(MSBuildThisFileDirectory)..\tools\net48\</NuGetUsingMSBuildCopyOutputFileToFastDebugTaskFolder>
<AssemblyFile>$(NuGetUsingMSBuildCopyOutputFileToFastDebugTaskFolder)\UsingMSBuildCopyOutputFileToFastDebug.dll</AssemblyFile>
</PropertyGroup>
在调用之前需要先引用
<UsingTask TaskName="UsingMSBuildCopyOutputFileToFastDebug.SafeOutputFileCopyTask"
AssemblyFile="$(AssemblyFile)" />
之后可以在 Target 里面使用 SafeOutputFileCopyTask 类名
<Target Name="CopyOutputLibToFastDebug" AfterTargets="AfterBuild"
Condition="$(MainProjectPath)!=''">
<ItemGroup>
<OutputFileToCopy Include="$(OutputPath)$(AssemblyName).dll"></OutputFileToCopy>
<OutputFileToCopy Include="$(OutputPath)$(AssemblyName).pdb"></OutputFileToCopy>
</ItemGroup>
<SafeOutputFileCopyTask SourceFiles="@(OutputFileToCopy)" DestinationFolder="$(MainProjectPath)"></SafeOutputFileCopyTask>
</Target>
如何添加属性
在继承 Microsoft.Build.Utilities.Task 的类里面添加属性就可以在直接使用,如我添加了 DestinationFolder 和 SourceFiles 属性
public class SafeOutputFileCopyTask : Microsoft.Build.Utilities.Task
{
public string[] SourceFiles { set; get; }
public string DestinationFolder { set; get; } public override bool Execute()
{
return true;
}
}
从上面代码可以看到,在 Task 里面添加列表数组的方法使用的是数组,如果使用的是列表那么在编译时将会提示
C:\Users\lindexi.github.io\.nuget\packages\dotnetcampus.usingmsbuildcopyoutputfiletofastdebug\1.1.352\Build\dotnetCampus.UsingMSBuildCopyOutputFileToFastDebug.targets(18,33): error MSB4069: MSBuild 不支持“SafeOutputFileCopyTask”任务的“SourceFiles”参数的“System.Collections.Generic.List`1[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]”类型。
C:\Users\lindexi.github.io\.nuget\packages\dotnetcampus.usingmsbuildcopyoutputfiletofastdebug\1.1.352\Build\dotnetCampus.UsingMSBuildCopyOutputFileToFastDebug.targets(18,33): error MSB4026: “SafeOutputFileCopyTask”任务的“SourceFiles=@(OutputFileToCopy)”参数无效。 [f:\temp\HogalcageBeganeqeale\HogalcageBeganeqeale.csproj]
C:\Users\lindexi.github.io\.nuget\packages\dotnetcampus.usingmsbuildcopyoutputfiletofastdebug\1.1.352\Build\dotnetCampus.UsingMSBuildCopyOutputFileToFastDebug.targets(18,9): error MSB4063: 未能使用“SafeOutputFileCopyTask”任务的输入参数初始化该任务。
输出消息
输出消息请使用 Console.WriteLine 就可以输出
输出警告和错误也使用 Console.WriteLine 方法,只是需要添加前缀 warning 如下面代码
Console.WriteLine("warning: 用户没有传入需要复制的文件");
更多请看 如何在 MSBuild Target(Exec)中报告编译错误和编译警告 - walterlv
本文用到的代码开源在 Github 欢迎关注 UsingMSBuildCopyOutputFileToFastDebug 如有问题欢迎讨论
2019-7-2-Roslyn-开发-NuGet-包的-Task-编译可能遇到的问题的更多相关文章
- 开发.NET Core NuGet包并实现CI/CD
实际开发中我们需要对一些公共类库进行开发,并基于Jenkins进行CI/CD(CI:持续集成,CD:持续部署),其他项目通过NuGet引用.上文讲述了如何搭建本地NuGet服务器并发布NuGet包,这 ...
- DotNetCore跨平台~linux上还原自主nuget包需要注意的问题
问题的产生的背景 由于我们使用了jenkins进行部署(jenkins~集群分发功能和职责处理),而对于.net core项目来说又是跨平台的,所以对它的项目拉取,包的还原,项目的编译和项目的发布都是 ...
- 使用腾讯云提供的针对Nuget包管理器的缓存加速服务
继阿里巴巴开源镜像站(https://opsx.alibaba.com/).华为云镜像站点(https://mirrors.huaweicloud.com/ )之后,腾讯也已于近日上线了类似的服务,官 ...
- [UWP] 为WinRT组件创建Nuget包
Nuget 是 dotnet 开发中必不可少的包管理工具,但不仅仅局限于 dotnet 项目,在 VS 中使用 C++ 开发的时候,也可以使用 Nuget 来引用第三方组件.同样也可以用 Nuget ...
- NEsper Nuget包
Esper是专门进行复杂事件处理(CEP)的流处理平台,Java版本为Esper,.Net版本为NEsper.Esper & NEsper可以方便开发者快速开发部署处理大容量消息和事件的应用系 ...
- 搭建本地Nuget服务器并使用NuGet Package Explorer工具打包nuget包
1.什么是Nuget: 百度百科描述: Nuget是 ASP .NET Gallery 的一员.NuGet 是免费.开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库. ...
- 使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)
最近在使用之前自己编写的批处理给.NET Core项目打包时出问题了,发现之前的脚本根本不适用了,折腾了半天,总算解决了.因此在这里分享下经验,并且奉上整理好的脚本. Nuget包这里就不多介绍了,需 ...
- [2016-07-15]nuget包管理器控制台下的powershell脚本介绍
博客有阵子没打理了,今天刚恢复样式,但是标题还是不太正常,总算能凑合看看. 回到正题,最近为了能在VS的程序包管理器控制台上能方便的自定义ps脚本去调整project的package,就开始看powe ...
- asp.net core 三 Nuget包管理
参考连接:http://www.cnblogs.com/netcore2/p/7412891.html 这里的说明,基本就是学习了别人的文章,自己做了个备份 asp.net c ...
- 02、NetCore2.0优化之Nuget包
02.NetCore2.0优化之Nuget包 在NetCore2.0中的包是如何管理的?如何存储的?微软做了哪些优化工作? -------------------------------------- ...
随机推荐
- SpringAOP中的aop:config标签
我们使用Spring的AOP功能的时候发现,我们使用普通的配置方式的时候,我们无法精确的确定将切面类中的哪个方法切入到哪个切入点上, 所以我们可以使用aop的专用标签来完成相关的配置.其中主要表现是使 ...
- 19.SimLogin_case01
什么是模拟登录? 要抓取的信息,只有在登录之后才能查看.这种情况下,就需要爬虫做模拟登录,绕过登录页. cookies和session的区别: cookie数据存放在客户的浏览器上,session数据 ...
- 2019 Multi-University Training Contest 6 Nonsense Time (纯暴力)
题意:给你一个n的排列,起初这些数都不能用, 然后还有一个数组 第 i 个数表示下标为 i 的数能够使用. 问每一个 i 对应的最长上升子序列. 题解: 可以通过倒推,从后往前考虑转化一下 ,然后就是 ...
- selenium学习笔记11——driver.get(url) 页面加载时间太长
在执行自动化测试用例过程中,发现因为网络慢或其他原因导致driver.get(url) 时,页面一直在加载,页面没有加载完成就不会去继续执行下面的动作,但是实际上需要操作的元素已经加载出来了. 解决方 ...
- 前端面试题之一JAVASCRIPT(理论类)
一.请描述一下 cookies.sessionstorage .localstorage 和session的区别?(1)cookie是网站为了标示用户身份而储存在用户本地终端(client side) ...
- windows下VisualSVN Server搭建
转自:https://www.cnblogs.com/shuilangyizu/p/10365604.html 使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和 ...
- opencv-阈值分割
关于自适应阈值,可参考:Wellner 自适应阈值二值化算法 一.大津法OTSU(最大类间方差法) 参考:非黑即白——图像分割入门篇之Otsu阈值 自适应阈值分割—大津法(OTSU算法)C++实现 灰 ...
- iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行
一.Runtime的理解 OC是面向对象的语言这是常识,其实就是通过Runtime机制动态创建类和对象,这里只是简单的运用runtime的使用! 二.类别(category)添加属性_使用前记得导入头 ...
- Docker系列(十五):Openshift 简介
1.简单了解openshift相关组件 1.openshift是基于容器技术构建的一个云平台 2.kubernetes是容器编排组件 3.docker是容器引擎驱动组件 4.openshift在Pas ...
- Linux 下的终端
终端: 1 虚拟终端 ctrl + alt + F(1-6) : ctrl + alt + F7 : 图形终端 启动图形终端 : Gnome : #startx 或者 #startx &am ...