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. jquery层次选择器:空格 > next + nextAll ~ siblings

    全栈工程师开发手册 (作者:栾鹏) jquery系列教程1-选择器全解 jquery层次选择器 jquery层次选择器,包括空格.>.next.+.nextAll.~.siblings等函数或表 ...

  2. Bash : test 命令

    在 Bash 脚本中我们一般会使用 test 命令来进行条件检查.test 命令的返回值为 0 或 1.0 表示 true, 1 表示 false.简单起见,我们可以直接认为 test 的结果为 tr ...

  3. 由String的构造方法引申出来的java字符编码

    在String类的constructors中,有一个constructor是将int数组类型转化为字符串: int[] num = {48,49,50,51,52}; String numStr = ...

  4. ViewPager使用记录1——展示固定数据

    ViewPager是v4支持库中的一个控件,相信几乎所有接触Android开发的人都对它不陌生.之所以还要在这里翻旧账,是因为我在最近的项目中有多个需求用到了它,觉得自己对它的认识不够深刻.我计划从最 ...

  5. 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块

    HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...

  6. vim-ultisnips补全功能失效,无法识别解决办法

    昨天又给vim配了一堆插件 发现了一个这个问题,vim的ultisnips插件不能用了! 首先,我先查看插件是否正常运行了 :script 从一堆正在运行插件里找到ultisnips的名字,说明插件正 ...

  7. java遍历hashMap、hashSet、Hashtable

    一.遍历HashMap Map<Integer, String> map = new HashMap<Integer, String>(); 方法一:效率高 for(Entry ...

  8. 程序员节应该写博客之.NET下使用HTTP请求的正确姿势

    程序员节应该写博客之.NET下使用HTTP请求的正确姿势 一.前言 去年9月份的时候我看到过外国朋友关于.NET Framework下HttpClient缺陷的分析后对HttpClient有了一定的了 ...

  9. mysql 中select for update 锁表的范围备注

    mysql的锁表范围测试 1.主键明确时,行级锁: 解释:指定主键并且数据存在时,仅锁定指定的行,其它行可以进行操作 实例:指定了锁定id=1的行且数据存在①,在更新1时lock wait超时②,但是 ...

  10. jsp <input type="checkbox" name="fileId"> 是否选中

    jsp <input type="checkbox" name="fileId"> 是否选中 var a = document.getElement ...