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

在我[上次介紹 Web Deployment Projects 的文章](/post/2009/01/27/Visual-Studio-2008-Web-Deployment-Project)中有提到你可以自行修改 Web Deployment Project ( WDP ) 的專案檔( \*.wdproj ) 的內容，因為此專案檔實際上是透過 [MSBuild](http://msdn.microsoft.com/zh-tw/library/0k6kkbsd.aspx) 編譯執行的，你可以自行擴充 BeforeBuild, BeforeMerge, AfterMerge, 或 AfterBuild 目標，不過當 WDP for VS2005 升級到 WDP for VS2008 時有做出一些調整，會導致有些自訂動作怎麼寫都不成功。

雖然在 [Using Web Deployment Projects with Visual Studio 2005](http://msdn.microsoft.com/en-us/library/aa479568.aspx) 文件解說的很詳盡，不過最重要的是原本的 $(TargetDir) 屬性已經改名了，在文件中原本的例子如下：

![MSBuild AfterBuild Target](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ee25728efbb07dfe10d6-image_3.png "MSBuild AfterBuild Target")

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

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

但當使用 [Visual Studio® 2008 Web Deployment Projects](http://web.archive.org/web/20130120130153/http://www.microsoft.com/en-us/download/details.aspx?id=25163) 時，該屬性應該改成 $(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)，所以需刪除的檔案必須一一個別定義才行。

**相關連結**

-   [ASP.NET 網站部署可考慮使用 Web Deployment Project](/post/2009/01/27/Visual-Studio-2008-Web-Deployment-Project)
