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

小说:三度论坛注册送26作者:北安杜更新时间:2018-10-18字数:47125

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


  • 前言

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

我的:

<PostBuildEvent>call "$(SolutionDir)tools oolsMagicodes.CmdTools.exe" copy -s "$(SolutionDir)plusJxy.WeChatJxy.WeChat.CoreinDebug et461Jxy.WeChat.Core.dll" -t "$(SolutionDir)srcMagicodes.Admin.Web.MvcwwwrootPlugIns"</PostBuildEvent>

<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>

 

推荐的:

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

 

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

 

  • $(TargetPath)变量为空

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

<PropertyGroup>

<PostBuildEvent>

echo 准备复制"$(TargetPath)"

call xcopy /s /y "$(TargetPath)" "$(SolutionDir)srcMagicodes.Cloud.AdminwwwrootPlugIns"

</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)srcMagicodes.Cloud.AdminwwwrootPlugIns" 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)srcMagicodes.Cloud.AdminwwwrootPlugIns" SourceFiles="$(TargetPath)" SkipUnchangedFiles="true" />

</Target>

</Project>

至此,本篇完成。

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

当前文章:http://leetaemin.cn/array/0ndbsmaqn6.html

发布时间:2018-10-18 17:54:59

917手机验证注册送10万 888真人注册送90元 不限ip注册送21元体验金可提现 神话娱乐注册送96元 全讯网网站注册送白菜 2014申请送现金娱乐城 线上娱乐自动送19元现金 龙城娱乐开户 娱乐金沙国际权威 乐博备用网

73092 21701 49267 17782 71345 3447792682 99817 31690

我要说两句: (0人参与)

发布