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>

    至此,本篇完成。

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

  • 相关阅读:
    深入理解javascript原型和闭包(10)——this
    深入理解javascript原型和闭包(9)——简述【执行上下文】下
    深入理解javascript原型和闭包(8)——简述【执行上下文】上
    深入理解javascript原型和闭包(7)——原型的灵活性
    golang 处理 json 结构体
    git push 时用户的配置
    vscod如何自定义 python虚拟环境
    Python实现图片的base64编码
    解决vscode中golang插件依赖安装失败问题
    (转)vscode实现markdown流程图
  • 原文地址:https://www.cnblogs.com/codelove/p/7866662.html
Copyright © 2011-2022 走看看