The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

Web Deployment Project 如何自訂 AfterBuild 目標(VS2008)

在我上次介紹 Web Deployment Projects 的文章中有提到你可以自行修改 Web Deployment Project ( WDP ) 的專案檔( *.wdproj ) 的內容,因為此專案檔實際上是透過 MSBuild 編譯執行的,你可以自行擴充 BeforeBuild, BeforeMerge, AfterMerge, 或 AfterBuild 目標,不過當 WDP for VS2005 升級到 WDP for VS2008 時有做出一些調整,會導致有些自訂動作怎麼寫都不成功。

雖然在 Using Web Deployment Projects with Visual Studio 2005 文件解說的很詳盡,不過最重要的是原本的 $(TargetDir) 屬性已經改名了,在文件中原本的例子如下:

MSBuild AfterBuild Target

附帶一提:這例子也有錯誤的地方,也就是 $(TargetDir) 其實本身就包括了「反斜線」結尾,正確的寫法應該是:

<Target Name="AfterBuild">
  <MakeDir Directories="$(TargetDir)Upload" />
</Target>

但當使用 Visual Studio® 2008 Web Deployment Projects 時,該屬性應該改成 $(WDTargetDir) 才對,如果你使用 $(TargetDir) 的話,會得到空字串,以致於會將目錄建立在專案輸出目錄所在磁碟的根目錄下。

如果你使用 Web Application 專案開發網站,通常會在 WDP 輸出專案後一併刪除專案檔刪除一些額外的目錄,範例如下:

<Target Name="AfterBuild">
  <!-- 在 Release 建置時,直接刪除 obj 目錄 -->
  <RemoveDir Directories="$(WDTargetDir)obj" 
             Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " /> <!-- 刪除專案檔 --> <Delete Files="$(WDTargetDir)WebApplication1.csproj" /> <!-- 刪除專案使用者定義檔 --> <Delete Files="$(WDTargetDir)WebApplication1.csproj.user" /> </Target>

在使用 RemoveDir 或 Delete 工作 (Task) 時,不能使用萬用字元(wildcard),所以需刪除的檔案必須一一個別定義才行。

相關連結