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-编译可能遇到的问题的更多相关文章

  1. 开发.NET Core NuGet包并实现CI/CD

    实际开发中我们需要对一些公共类库进行开发,并基于Jenkins进行CI/CD(CI:持续集成,CD:持续部署),其他项目通过NuGet引用.上文讲述了如何搭建本地NuGet服务器并发布NuGet包,这 ...

  2. DotNetCore跨平台~linux上还原自主nuget包需要注意的问题

    问题的产生的背景 由于我们使用了jenkins进行部署(jenkins~集群分发功能和职责处理),而对于.net core项目来说又是跨平台的,所以对它的项目拉取,包的还原,项目的编译和项目的发布都是 ...

  3. 使用腾讯云提供的针对Nuget包管理器的缓存加速服务

    继阿里巴巴开源镜像站(https://opsx.alibaba.com/).华为云镜像站点(https://mirrors.huaweicloud.com/ )之后,腾讯也已于近日上线了类似的服务,官 ...

  4. [UWP] 为WinRT组件创建Nuget包

    Nuget 是 dotnet 开发中必不可少的包管理工具,但不仅仅局限于 dotnet 项目,在 VS 中使用 C++ 开发的时候,也可以使用 Nuget 来引用第三方组件.同样也可以用 Nuget ...

  5. NEsper Nuget包

    Esper是专门进行复杂事件处理(CEP)的流处理平台,Java版本为Esper,.Net版本为NEsper.Esper & NEsper可以方便开发者快速开发部署处理大容量消息和事件的应用系 ...

  6. 搭建本地Nuget服务器并使用NuGet Package Explorer工具打包nuget包

    1.什么是Nuget: 百度百科描述: Nuget是 ASP .NET Gallery 的一员.NuGet 是免费.开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库. ...

  7. 使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)

    最近在使用之前自己编写的批处理给.NET Core项目打包时出问题了,发现之前的脚本根本不适用了,折腾了半天,总算解决了.因此在这里分享下经验,并且奉上整理好的脚本. Nuget包这里就不多介绍了,需 ...

  8. [2016-07-15]nuget包管理器控制台下的powershell脚本介绍

    博客有阵子没打理了,今天刚恢复样式,但是标题还是不太正常,总算能凑合看看. 回到正题,最近为了能在VS的程序包管理器控制台上能方便的自定义ps脚本去调整project的package,就开始看powe ...

  9. asp.net core 三 Nuget包管理

        参考连接:http://www.cnblogs.com/netcore2/p/7412891.html     这里的说明,基本就是学习了别人的文章,自己做了个备份     asp.net c ...

  10. 02、NetCore2.0优化之Nuget包

    02.NetCore2.0优化之Nuget包 在NetCore2.0中的包是如何管理的?如何存储的?微软做了哪些优化工作? -------------------------------------- ...

随机推荐

  1. spring加载属性配置文件内容

    在spring中提供了一个专门加载文件的类PropertyPlaceholderConfigurer,通过这个类我们只需要给定需要加载文件的路径就可以 通过该类加载到项目,但是为了后面在程序中需要使用 ...

  2. 愚人节老板发话了,免费送书 + 免费入驻Java知识星球!!

    愚人节快乐,今天的活动很重磅! 1.免费送5本重量级技术书籍,不骗人,小程序随机抽奖送出哦! 2.免费进星球,哈哈不可能,愚人节快乐!不过今天有重大优惠,见下文! 活动一:免费送出5本重量级书籍 赠书 ...

  3. Java之RabbitMQ(二)多mq配置

    场景: springboot单项目,自身使用mq中间件处理一些业务需求,某些业务上又需要消费第三方mq消息,这时候需要我们单项目中配置多套mq,这时候,需要我们自定义多套mq相关连接工厂.模板.监听工 ...

  4. 第四周课堂笔记1th

    函数   关键字def   函数名加括号  是调用函数   Return   相当于给函数算完之后给予另一个返回值   返回的是元组 如果return后没写返回none Return在函数中可以结束整 ...

  5. C++构造与析构函数中调用虚函数的问题

    前些天想把以前写的内存池算法重写一遍,跨平台是第一目标,当时突发奇想,因为不愿意做成一大堆#if..#end,所以想利用C++的多态性,但是怎么让内存池完好退出却没想到自认为完美的方案.但是一个很偶然 ...

  6. vue之vant组件下拉加载更多

    vant地址:https://youzan.github.io/vant/#/zh-CN/intro 基础用法 List 组件通过loading和finished两个变量控制加载状态,当组件滚动到底部 ...

  7. shell与crontab定时器的结合

    crond服务 以守护进程方式在无需人工干预的情况下来处理一些列的作业指令与服务 查看服务状态 systemctl status cron.service 停止服务 systemctl stop cr ...

  8. 菜鸟nginx源码剖析数据结构篇(五) 基数树 ngx_radix_tree_t[转]

    菜鸟nginx源码剖析数据结构篇(五) 基数树 ngx_radix_tree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blo ...

  9. Windows的进程间通信

    对于任何一个现代的操作系统,进程间通信都是其系统结构的一个重要组成部分.而说到Windows的进程(线程)间通信,那就要看是在什么意义上说了.因为正如"Windows的跨进程操作" ...

  10. #、%和$符号在OGNL表达式中的作用

    #.%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分.在这里笔者简单介绍它们的相应用途. 1.#符号的用途一般有三种.   1)访问非根对象属性,例如示例中的#ses ...