当前位置: 首页 > news >正文

.NET Core工程编译事件$(TargetDir)变量为空引发的思考

  • 前言

最近客户反馈,为啥不用xcopy命令代替我自己写的命令来完成插件编译复制:

我的:

<PostBuildEvent>call "$(SolutionDir)tools\tools\Magicodes.CmdTools.exe" copy -s "$(SolutionDir)plus\Jxy.WeChat\Jxy.WeChat.Core\bin\Debug\net461\Jxy.WeChat.Core.dll" -t "$(SolutionDir)src\Magicodes.Admin.Web.Mvc\wwwroot\PlugIns"</PostBuildEvent>

<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>

 

推荐的:

call xcopy /s /y "$(TargetPath)" "$(SolutionDir)src\ Magicodes.Admin.Web.Mvc \wwwroot\PlugIns\"

 

我深以为然,xcopy是我之前经常用来做编译复制的命令,为啥我后面自己整了一个工具来复制呢?太久了,记不起来了,索性鼓捣鼓捣。

 

  • $(TargetPath)变量为空

很快,我就发现了问题。在.NET Core的工程中,很多变量是获取不到值的,如下命令:

<PropertyGroup>

<PostBuildEvent>

echo 准备复制"$(TargetPath)"

call xcopy /s /y "$(TargetPath)" "$(SolutionDir)src\Magicodes.Cloud.Admin\wwwroot\PlugIns\"

</PostBuildEvent>

 

</PropertyGroup>

输出:

但是在VS的命令行编辑工具里面,这些变量应该都是有值的:

于是我回想起来了,之前似乎就是遇到这个问题,因为时间紧迫,自己写了一个命令行工具代替了之前的命令。今天再次碰到,于是决心深挖一下,从理论上来讲,VS不应该犯这么低级的错误。

 

  • 寻找原因,解决问题

我想,这个问题已经出现许久了,也许老外会给我一些启发。找过了stackoverflow,没发现有用的信息,不过最终在Github找到了一些有用的内容。

比如说这篇:

https://github.com/dotnet/sdk/issues/1055

$(TargetPath) or $(TargetDir) are empty on PostBuild event on netstandard project

从下面的答复中,我们看到了这条关键内容:

大意似乎是,编译事件被target元素代替了。但是大哥,都这么久了,为啥通过项目工程的界面编辑,生成的元素还是PostBuildEvent,你们这不是坑人么。。。

说明一点,VS界面的调整跟不上相关API和规则的调整。。。

问题似乎解决了:

我们再进一步完善:

看起来需求已经实现了,理论上就可以就此结束了。但是Target是什么鬼?

 

  • 进阶

来来来,我们直接去看官方文档:

https://msdn.microsoft.com/zh-cn/library/t50z2hka.aspx

突然发现这是一个很有意思的元素。文档很简单,但是我发现基于此,可以有很多玩法。

比如你看看这篇:https://msdn.microsoft.com/zh-CN/library/3e54c37h.aspx

那么,我们可以将上述命令进行改进:

<Target Name="PostBuild" AfterTargets="PostBuildEvent">

<Message Text="将插件复制到插件目录" Importance="high" />

<Copy DestinationFolder="$(SolutionDir)src\Magicodes.Cloud.Admin\wwwroot\PlugIns\" SourceFiles="$(TargetPath)" SkipUnchangedFiles="true" />

</Target>

是否看起来又更进了一步。

Import是什么鬼?请看大屏幕,哦,看链接:

https://msdn.microsoft.com/zh-cn/library/ms171464.aspx

copyplus.props定义如下:

<Project>

<Target Name="PostBuild" AfterTargets="PostBuildEvent">

<Message Text="将插件复制到插件目录" Importance="high" />

<Copy DestinationFolder="$(SolutionDir)src\Magicodes.Cloud.Admin\wwwroot\PlugIns\" SourceFiles="$(TargetPath)" SkipUnchangedFiles="true" />

</Target>

</Project>

至此,本篇完成。

希望本篇内容,能够给大家更多启发,并且开发出更多玩法。

相关文章:

  • 菜鸟学Linux 第065篇笔记 nfs
  • 更改INSM地址的操作
  • centos 7 yum安装kubernetes cluster 1.0
  • C++字符串string类常用操作详解(一)【初始化、遍历、连接】
  • Java设计模式圣经连载(03)-抽象工厂模式
  • Centos中文乱码问题的解决。
  • Python函数知识汇总-课堂笔记
  • AD与DNS集成,且有备份AD与DNS,主AD与DNS坏,备份DNS如何成为主
  • SubSonic3.0使用外连接查询时查询不出数据的问题修改
  • 海量文件拷贝(Windows/Linux)
  • VS.net和Reflector 图标解释
  • EPEL源
  • centos7 修改mac地址
  • c# 4.0新特性一览
  • 荣光医院医道会比赛策略
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • extjs4学习之配置
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 创建一个Struts2项目maven 方式
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 简析gRPC client 连接管理
  • 聊聊sentinel的DegradeSlot
  • 一份游戏开发学习路线
  • 责任链模式的两种实现
  • 【云吞铺子】性能抖动剖析(二)
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Spring Batch JSON 支持
  • 从如何停掉 Promise 链说起
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​人工智能书单(数学基础篇)
  • #162 (Div. 2)
  • #AngularJS#$sce.trustAsResourceUrl
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (python)数据结构---字典
  • (笔试题)分解质因式
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十三)Maven插件解析运行机制
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • . NET自动找可写目录
  • .md即markdown文件的基本常用编写语法
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • @Bean有哪些属性
  • @WebService和@WebMethod注解的用法
  • [ C++ ] STL---stack与queue
  • []sim300 GPRS数据收发程序
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [C++]二叉搜索树
  • [CF543A]/[CF544C]Writing Code
  • [LeetCode] 596:超过5名学生的课
  • [Oh My C++ Diary]operator++()和operator++(int)的区别