zoukankan      html  css  js  c++  java
  • .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>

    至此,本篇完成。

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

  • 相关阅读:
    如何使用Jquery 引入css文件
    html如何绘制带尖角(三角)的矩形
    让HTML标签、DIV、SPAN拥有focus事件和blur事件,聚焦和失焦
    html如何引用另一个html的内容
    HTML中块级元素与内联元素有什么区别 ?
    一个js文件如何加载另外一个js文件
    在线工具-程序员的工具箱-在线Cron表达式生成器
    oracle fm格式化
    html如何让label在div中的垂直方向居中显示?
    服务发现框架选型: Consul、Zookeeper还是etcd ?
  • 原文地址:https://www.cnblogs.com/codelove/p/7866662.html
Copyright © 2011-2022 走看看