-
前言
最近客戶反饋,為啥不用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是我之前經常用來做編譯復制的命令,為啥我后面自己整了一個工具來復制呢?太久了,記不起來了,索性鼓搗鼓搗。
-
$(TargetPath)變量為空
很快,我就發現了問題。在.NET Core的工程中,很多變量是獲取不到值的,如下命令:
<PropertyGroup>
<PostBuildEvent>
echo 准備復制"$(TargetPath)"
call xcopy /s /y "$(TargetPath)" "$(SolutionDir)src\Magicodes.Cloud.Admin\wwwroot\PlugIns\"
</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)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>
至此,本篇完成。
希望本篇內容,能夠給大家更多啟發,並且開發出更多玩法。