1. 前言

最近客户反馈,为啥不用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是我之前经常用来做编译复制的命令,为啥我后面自己整了一个工具来复制呢?太久了,记不起来了,索性鼓捣鼓捣。

  1. $(TargetPath)变量为空

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

<PropertyGroup>

<PostBuildEvent>

echo 准备复制"$(TargetPath)"

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

</PostBuildEvent>

</PropertyGroup>

输出:

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

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

  1. 寻找原因,解决问题

我想,这个问题已经出现许久了,也许老外会给我一些启发。找过了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是什么鬼?

  1. 进阶

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

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>

至此,本篇完成。

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

.NET Core工程编译事件$(TargetDir)变量为空引发的思考的更多相关文章

  1. 【.Net Core】编译时禁止自动生成netcoreapp文件夹

    原文:[.Net Core]编译时禁止自动生成netcoreapp文件夹 每次在编译生成文件时,VS都会自动在<OutputPath>属性指定的路劲后再追加一个用NetCore命名的文件夹 ...

  2. eclipse中多个工程编译到同一个目录下

    1.点击link source  2.选择Java(ps:Java文件目录)或者resource(ps:配置文件目录)  3.最后结果,然后使用project中的clean进行编译,就可以把两个工程编 ...

  3. xcode工程编译错误:No architectures to compile for

    问题 开发环境:xcode6,iPhone6模拟器 xcode工程编译错误:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active ...

  4. Python工程编译成跨平台可执行文件(.pyc)

    原文:https://blog.csdn.net/zylove2010/article/details/79593655 在某些场景下,若不方便将python编写的源码工程直接给到其他人员,则可以将p ...

  5. nixyx —— 一个小巧的项目工程/编译文件生成器(构建系统?)

    恩..nixyx确实算不上是一个构建系统. 所谓构建系统,比如GNU的Autotools,那是一套很完整的构建体系,包括了程序的配置,编译和安装三大部分. 类似的软件还有:google的gyp.腾讯的 ...

  6. 痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加C++源文件进SDK工程编译的方法. 最近有客户反映在MCUXpresso IDE下的SDK工程里添加 ...

  7. 痞子衡嵌入式:MCUXpresso IDE下添加新路径下源文件进工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法. 接着上篇文章 <MCUXpresso IDE下SDK工程导入与 ...

  8. VS2005工程的Device右边内容为空问题

    VS2005工程的Device右边内容为空问题 可能是刚刚在删除C盘一些文件或是这些文件因为某些原因丢失了,在打开WINCE6.0系统工程的时候,发现无法编译,才注意到VS2005工程的Device右 ...

  9. PHP中判断变量为空的几种方法

    判断变量为空,在许多场合都会用到,同时自己和许多新手一样也经常会犯一些错误, 所以自己整理了一下PHP中一些常用的.判断变量为空的方法. 1. isset功能:判断变量是否被初始化本函数用来测试变量是 ...

随机推荐

  1. C# XML序列化方法和常用特性

    /* C#对象XML序列化(一):序列化方法和常用特性 .Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和 ...

  2. 逆波兰表达式(RPN)算法简单实现

    算法分析: 一.预处理 给定任意四则运算的字符串表达式(中缀表达式),preDeal预先转化为对应的字符串数组,其目的在于将操作数和运算符分离. 例如给定四则运算内的中缀表达式: String inf ...

  3. menu菜单项和menubutton菜单按钮的结合使用

    <!--创建需要显示的菜单按钮(munebutton),menu指定的是菜单项--><a href="javascript:void(0)" id="m ...

  4. 敏捷开发(2)-Scrum

    什么是SCRUM Scrum的英文意思是橄榄球运动的一个专业术语,表示“争球”的动作:把一个开发流程的名字取名为Scrum,我想你一定能想象出你的开发团队在开发一个项目时,大家像打橄榄球一样迅速.富有 ...

  5. 使用docker 解决一个小问题,你也可能用的到

    以前一直觉得docker是运维用的工具,或者devops 用的工具,一般人应该用不上,直到最近发现docker 还有另外一个妙用,不管是什么语言. 这几天开会网络特别不好,nodejs npm 仓库 ...

  6. win10 UWP MessageDialog 和 ContentDialog

    我之前开发一个软件 winMarkdown,这个软件在关闭需要提示用户还没有保存东西,需要保存,如果用户选择退出,那么把数据存放. 在Metro程序中,没有传统的窗口,当我们要用需要交互的消息提示时, ...

  7. Ubuntu系统下的实用软件推荐

    想要在ubuntu下工作? 又担心影响效率? 这些软件可以帮助你解决问题 ! 基本在windows上可以做到的功能, 在linux中也同样能够实现,而且自己寻找解决方案的过程才是最有趣的! 1.gua ...

  8. MYSQL 总结

    1.数据库实质中访问的是 DBMC,数据库是一种存储介质 2.groub by 与 having 理解 group by 有一个原则,select后面的所有列中,没有使用聚合函数的列必须出现在 gro ...

  9. web.xml中<init-param>报错

    报错信息如下图: 控制台报错:严重: Servlet /*** threw load() exceptionjava.lang.ClassNotFoundException: MyApplicatio ...

  10. LeetCode 118. Pascal's Triangle (杨辉三角)

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...