文章目錄
Visual Studio 建置前事件( Pre-build Event ) / 建置後事件( Post-build Event)
同事在被
參考的專案中新增一個 config 檔案,並且設為 Copy always
,設定後 config 檔案會在發行時自動加入 bin 資料夾,但考慮到可能日後會直接修改線上設定,不想直接修改位於 bin 資料夾內的 config 檔案而引發 IIS recycle,所以希望可以把 config 搬離 bin 資料夾,所以打算透過 Visual Studio 的 Build Events 來將 config 檔案移出 bin 資料夾,需要讀取該檔案的位置再透過相對路徑來讀取
雖然我覺得解決方式不是非常正統,但舊系統我想可以讓需求獲得滿足是最重要的,就來看看如何使用 Visual Studio 建置前事件( Pre-build Event ) / 建置後事件( Post-build Event) 吧
編譯設定
專案右鍵 –> Properties
Build Events
使用巨集
巨集指令(Macros)
巨集 | 描述 |
---|---|
$(OutDir) | 編譯後的輸出路徑。 結尾會有反斜線 \ (e.g. bin\ ) |
$(ConfigurationName) | build mode (e.g. Debug ,Release ) |
$(ProjectName) | 專案名稱 (e.g.Opserver ) |
$(TargetName) | 建置後輸出 dll 的檔名 (e.g. StackExchange.Opserver ) |
$(TargetPath) | 建置後輸出 dll 的絕對路徑及檔名 (定義為磁碟機 + 路徑 + 主檔名 + 副檔名) e.g. D:\Downloads\Opserver-overhaul\Opserver\bin\StackExchange.Opserver.dll |
$(ProjectPath) | 專案檔的絕對路徑 (定義為磁碟機 + 路徑 + 主檔名 + 副檔名) e.g. D:\Downloads\Opserver-overhaul\Opserver\Opserver.csproj |
$(ProjectFileName) | 專案完整檔名 e.g. Opserver.csproj |
$(TargetExt) | 建置主要輸出檔的副檔名。 在副檔名之前包括一個 . (e.g. .dll ) |
$(TargetFileName) | 建置後輸出 dll 的完整檔名 (定義為主檔名 + 副檔名) e.g. StackExchange.Opserver.dll |
$(DevEnvDir) | Visual Studio 安裝目錄 ;結尾會有反斜線 \ (e.g. C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ ) |
$(TargetDir) | 建置後輸出目錄 (定義為磁碟機 + 路徑)。結尾會有反斜線 \ (e.g. D:\Downloads\Opserver-overhaul\Opserver\bin\ ) |
$(ProjectDir) | 專案位置路徑 (定義為磁碟機 + 路徑),結尾會有反斜線 \ (e.g. D:\Downloads\Opserver-overhaul\Opserver\ ) |
$(SolutionFileName) | 方案完整檔名 (e.g. {方案檔案名稱}.sln ) e.g. Opserver.sln |
$(SolutionPath) | 方案檔的絕對路徑 (定義為磁碟機 + 路徑 + 主檔名 + 副檔名) e.g. D:\Downloads\Opserver-overhaul\Opserver.sln |
$(SolutionDir) | 方案的目錄路徑 (定義為磁碟機 + 路徑),結尾會有反斜線 \ e.g. D:\Downloads\Opserver-overhaul\ |
$(SolutionName) | 方案的檔名。(e.g. Opserver ) |
$(PlatformName) | 編譯的目標平台。 (e.g. AnyCPU ) |
$(ProjectExt) | 專案檔的副檔名。 在副檔名之前包括一個 . (e.g. .cs[roj ) |
$(SolutionExt) | 方案的副檔名。 在副檔名之前包括一個 . 。(e.g. .sln ) |
語法
- 使用 command prompt script (e.g. xcopy,robocopy)
- 巨集可以搭配相對目錄 (e.g.
$(SolutionDir)..\..\
表示SolutionDir
往上兩層)
建置後事件( Post-build Event) 執行時機
Always
無論編譯成功與否皆執行
On successful build
僅在編譯成功時執行
When the build updates the project output
只有編譯需要更新輸出內容時執行
VS 在 robocopy 使用時出現錯誤
The command "robocopy D:\JenkinsData D:\my-app /s *.json" exited with code 1.
robocopy 執行代碼
代碼可累加 (e.g.
7
代表1
+2
+4
皆發生)exit code 說明 0 沒有錯誤,也沒有複製任何檔案,來源與目標已同步 1 檔案已成功複製 2 偵測到目標有額外檔案(檔案比來源目錄還多) 4 檔案或是資料夾不一致 8 檔案或是資料夾無法被複製(複製出錯且重試次數過多) 16 錯誤,無法複製任何檔案(使用方法錯誤或是權限不足)
解決方式
- exit code 小於等於
7
都算是成功,輸出0
如果 大於等於
8
就算失敗,輸出1
IF %ERRORLEVEL% LEQ 7 exit /b 0 Rem ELSE exit /b 1
- exit code 小於等於
參考資料
文章作者 Yowko Tsai
上次更新 2021-10-13
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。