.NET Core工程編譯事件$(TargetDir)變量為空引發的思考


  • 前言

最近客戶反饋,為啥不用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>

至此,本篇完成。

希望本篇內容,能夠給大家更多啟發,並且開發出更多玩法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM