-
前言
最近客户反馈,为啥不用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>
至此,本篇完成。
希望本篇内容,能够给大家更多启发,并且开发出更多玩法。
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。