﻿# 如何對 ASP.NET Web Site Project 進行 CI 持續整合與建置

今天在公司有位小伙伴問我說：「保哥，公司最近接到一個維護案，我拿到 Source Code 的時候都看不到 \*.csproj 專案檔或 \*.sln 方案檔耶，這樣怎麼用 Visual Studio 2022 開發？」我說：「你就是太年輕了，才不知道有 ASP.NET Web Site Project 的存在，你只碰過 ASP.NET Web Application Project 而已。」我在指導完他如何開啟與將 ASP.NET Web Site Project 加入版控後(很多雷)，就順手把 CI Pipelines 設定起來，這篇章我就來說說如何對 ASP.NET Web Site Project 進行自動建置。

![ASP.NET Compilation Tool](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ee5e2af31e5cc232eb93-bfc8a48b-eaea-4404-bd3a-30fb16b21d89.webp)

由於 ASP.NET Web Site Project 並沒有專案檔的存在，而且 ASP.NET Web Site Project 只能跑在 IIS 底下，所以基本上要對這種類型的網站進行自動化建置，就要透過 [ASP.NET Compilation Tool](https://learn.microsoft.com/en-us/previous-versions/dotnet/netframework-2.0/ms229863\(v=vs.80\)?WT.mc_id=DT-MVP-4015686) (`aspnet_compiler.exe`) 工具來執行，這是一套從 ASP.NET 2.0 就存在的古老工具，內建在 .NET Framework 之中。

首先，你要先找到 `aspnet_compiler.exe` 工具的所在目錄，因為該目錄預設並沒有加入 `PATH` 環境變數，所以執行時建議寫上完整路徑。從我的電腦可以找到 4 個不同的執行檔路徑，請自己選擇適合的版本來執行：

1.  `C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_compiler.exe`
    
    .NET Framework 4.0+ 與 64-bits 版本
    
2.  `C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe`
    
    .NET Framework 4.0+ 與 32-bits 版本
    
3.  `C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_compiler.exe`
    
    .NET Framework 2.0 ~ 3.5 與 64-bits 版本
    
4.  `C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe`
    
    .NET Framework 2.0 ~ 3.5 與 32-bits 版本
    

再來，我們就看看幾個不同的使用方法：

1.  主機沒有 IIS 伺服器，只有原始碼所在的實體目錄
    
    ```
    aspnet_compiler.exe -v / -p $(Build.SourcesDirectory)
    ```
    
    > 其中 `$(Build.SourcesDirectory)` 為你的原始碼所在目錄。
    
2.  主機沒有 IIS 伺服器，只有原始碼所在的實體目錄，編譯失敗時要顯示 Stack Trace 資訊
    
    ```
    aspnet_compiler.exe -v / -p $(Build.SourcesDirectory) -errorstack
    ```
    
    > 其中 `$(Build.SourcesDirectory)` 為你的原始碼所在目錄，而 `-errorstack` 則會跟你講發生錯誤的完整堆疊資訊(Stack Trace)(老實說沒什麼用)。
    
3.  網站已經部署到 IIS 伺服器，可以直接指定預設站台的虛擬路徑 `/WebApplication1`
    
    ```
    aspnet_compiler.exe -v /WebApplication1
    ```
    
    > 如果只有用 `-v /` 參數，預設他會去找 `LM/W3SVC/1/ROOT` (預設網站) 底下的虛擬目錄來建置。
    
4.  主機沒有 IIS 伺服器，只有原始碼所在的實體目錄，你想發行**預先編譯**的網站到指定資料夾
    
    ```
    aspnet_compiler.exe -v / -p $(Build.SourcesDirectory) -u $(Build.ArtifactStagingDirectory)
    ```
    
    > 這種編譯方式不會輸出 `*.cs` 原始碼
    
    > 其中 `$(Build.SourcesDirectory)` 為你的原始碼所在目錄，而 `$(Build.ArtifactStagingDirectory)` 則為網站輸出路徑。
    
5.  主機沒有 IIS 伺服器，只有原始碼所在的實體目錄，你想發行**預先編譯**的網站到指定資料夾，輸出的 DLL 要固定檔名
    
    ```
    aspnet_compiler.exe -v / -p $(Build.SourcesDirectory) -u $(Build.ArtifactStagingDirectory) -fixednames
    ```
    
    > 這種編譯方式不會輸出 `*.cs` 原始碼
    
    > 其中 `$(Build.SourcesDirectory)` 為你的原始碼所在目錄，而 `$(Build.ArtifactStagingDirectory)` 則為網站輸出路徑，加入 `-fixednames` 則代表替每一個 aspx, ascx, ... 頁面建立獨立的 `*.dll` 檔案，詳見 [Fixed Assembly Names](https://learn.microsoft.com/en-us/previous-versions/dotnet/netframework-2.0/ms229863\(v=vs.80\)?WT.mc_id=DT-MVP-4015686#fixed-assembly-names) 說明。
    

### 相關連結

-   [How to: Precompile ASP.NET Web Sites](https://learn.microsoft.com/en-us/previous-versions/aspnet/ms227972\(v=vs.100\)?WT.mc_id=DT-MVP-4015686)
-   [ASP.NET Precompilation Overview](https://learn.microsoft.com/en-us/previous-versions/aspnet/bb398860\(v=vs.100\)?WT.mc_id=DT-MVP-4015686)
    -   [How to: Precompile ASP.NET Web Sites for Deployment](https://learn.microsoft.com/en-us/previous-versions/aspnet/ms227976\(v=vs.100\)?WT.mc_id=DT-MVP-4015686)
    -   [How to: Sign Assemblies for Precompiled Web Sites](https://learn.microsoft.com/en-us/previous-versions/aspnet/ms228209\(v=vs.100\)?WT.mc_id=DT-MVP-4015686)
    -   [How to: Create Versioned Assemblies for Precompiled Web Sites](https://learn.microsoft.com/en-us/previous-versions/aspnet/ms228042\(v=vs.100\)?WT.mc_id=DT-MVP-4015686)
-   [ASP.NET Compilation Tool (Aspnet\_compiler.exe) | Microsoft Learn](https://learn.microsoft.com/en-us/previous-versions/dotnet/netframework-2.0/ms229863\(v=vs.80\)?WT.mc_id=DT-MVP-4015686)
-   [Web Application Projects versus Web Site Projects in Visual Studio | Microsoft Learn](https://learn.microsoft.com/en-us/previous-versions/aspnet/dd547590\(v=vs.110\)?WT.mc_id=DT-MVP-4015686)
-   [ASP.NET Website vs ASP.NET Web Application project](https://www.linkedin.com/pulse/aspnet-website-vs-web-application-project-prasad-narwadkar)
