共用方式為


疑難排解封裝程序

演講者:Jason Lee

本主題說明如何使用 Microsoft Build 引擎 (MSBuild) 中的 EnablePackageProcessLoggingAndAssert 屬性收集有關封裝程序的詳細資訊。

當您將 EnablePackageProcessLoggingAndAssert 屬性設為 True 時,MSBuild 將:

  • 將有關封裝程序的附加資訊新增至建置記錄中。
  • 記錄某些情況下的錯誤,例如,如果在封裝清單中發現重複檔案。
  • ProjectName_Package 資料夾中建立 Log 目錄,並使用它來記錄有關正在封裝的檔案的資訊。

如果封裝程序失敗,或者您的 Web 部署包不包含您期望的文件,您可以使用此資訊對過程進行疑難排解,找出發生問題的位置。

注意

只有當使用「偵錯」設定建置專案時,EnablePackageProcessLoggingAndAssert 屬性才有效。 在其他設定中該屬性會忽略。

本主題圍繞著一家名為 Fabrikam, Inc. 的虛構公司展開,針對其企業部署需求而設計了一系列教學課程。本教學課程系列使用範例解決方案 (聯絡人管理員解決方案) 來代表具有現實複雜性的 Web 應用程式,其中包括 ASP.NET MVC 3 應用程式、Windows Communication Foundation (WCF) 服務,和資料庫專案。

這些教學課程的核心部署方法是根據「了解專案檔案」中所述的分割專案檔案方法,其中建置流程由兩個專案檔案控制,一個包含適用於所有目標環境的建置指令,另一個則包含特定環境的建置和部署設定。 在建置時,特定於環境的專案檔案被合併到與環境無關的專案檔案中,以形成完整的建置指令集。

了解 EnablePackageProcessLoggingAndAssert 屬性

建置和封裝 Web 應用程式專案說明了 Web Publishing Pipeline (WPP) 如何提供一組 MSBuild 目標,這些目標擴展了 MSBuild 的功能並使其能夠與網際網路資訊服務 (IIS) Web 部署工具 (Web Deploy) 整合。 當您封裝 Web 應用程式專案時,將叫用 WPP 目標。

許多 WPP 目標都包含條件邏輯,當 EnablePackageProcessLoggingAndAssert 屬性設為 True 時,這些邏輯會記錄附加資訊。 例如,如果您查看套件目標,您可以看到,如果 EnablePackageProcessLoggingAndAssert 等於 True,它會建立一個附加記錄目錄,並將檔案清單寫入文字檔案。

<Target Name="Package"
        Condition="$(_CreatePackage)"
        DependsOnTargets="$(PackageDependsOn)">

    <!--Log the information  Set $(EnablePackageProcessLoggingAndAssert) to True        
                 if you want to see this information-->
    <MakeDir Condition="$(EnablePackageProcessLoggingAndAssert) And 
                        !Exists('$(PackageLogDir)')"
             Directories="$(PackageLogDir)" />
    <WriteLinesToFile Condition="$(EnablePackageProcessLoggingAndAssert)"
                      Encoding="utf-8"
                      File="$(PackageLogDir)\Prepackage.txt"
                      Lines="@(FilesForPackagingFromProject->'
                             From:%(Identity) 
                             DestinationRelativePath:%(DestinationRelativePath) 
                             Exclude:%(Exclude) 
                             FromTarget:%(FromTarget) 
                             Category:%(Category)
                             ProjectFileType:%(ProjectFileType)')" 
                      Overwrite="True" />

注意

WPP 目標在 %PROGRAMFILES(x86)%\MSBuild\Microsoft\VisualStudio\v10.0\Web 資料夾中的 Microsoft.Web.Publishing.targets 檔案中定義。 您可以開啟此檔案並在 Visual Studio 2010 或任何 XML 編輯器中查看目標。 注意不要修改文件的內容。

啟用附加記錄

您可以透過多種方式為 EnablePackageProcessLoggingAndAssert 屬性提供值,具體取決於您建置專案的方式。

如果從命令列建置項目,則可以為 EnablePackageProcessLoggingAndAssert 屬性提供一個值作為命令列參數:

MSBuild.exe /t:Build
            /p:Configuration=DEBUG
            /p:DeployOnBuild=true
            /p:DeployTarget=Package
            /p:EnablePackageProcessLoggingAndAssert=true
            [Your project].csproj

如果使用自訂專案檔案來建置專案,則可以在 MSBuild 工作的 Properties 屬性中包含 EnablePackageProcessLoggingAndAssert 值:

<Target Name="BuildProjects" Condition=" '$(BuildingInTeamBuild)'!='true' ">
   <MSBuild Projects="@(ProjectsToBuild)"
            Properties="OutDir=$(OutputRoot);
                        Configuration=$(Configuration);
                        DeployOnBuild=true;
                        DeployTarget=Package;
                        EnablePackageProcessLoggingAndAssert=true"
            Targets="Build" />
  </Target>

如果您使用 Team Foundation Server (TFS) 建置定義來建置專案,則可以為 MSBuild Arguments 行中的 EnablePackageProcessLoggingAndAssert 屬性提供值:如果您使用 Team Foundation Server (TFS) 建置定義來建置專案,則可以為 MSBuild Arguments 中的 EnablePackageProcessLoggingAndAssert 屬性提供值:

注意

有關建立和設定建置定義的更多資訊,請參閱「建立支援部署的建置定義」。

或者,如果您希望在每個建置中包含該套件,您可以修改 Web 應用程式專案的專案文件,將 EnablePackageProcessLoggingAndAssert 屬性設為 True。 您應該將該屬性新增至 .csproj 或 .vbproj 檔案中的第一個 PropertyGroup 元素。

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="...">
  <PropertyGroup>
    <EnablePackageProcessLoggingAndAssert 
       Condition=" '$(EnablePackageProcessLoggingAndAssert)' == '' ">
         true
    </EnablePackageProcessLoggingAndAssert>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

查看記錄檔

當您建置並封裝 Web 應用程式專案,並將 EnablePackageProcessLoggingAndAssert 設為 True 時,MSBuild 將在 ProjectName_Package 資料夾中建立一個名為 Log 的附加資料夾。 Log 資料夾包含各種檔案:

MSBuild 在 ProjectName_Package 資料夾中建立一個名為 Log 的附加資料夾。

您看到的文件清單將根據項目中的內容和建置程序而有所不同。 但是,這些文件通常用於記錄 WPP 在程序的各個階段收集用於封裝的文件清單:

  • PreExcludePipelineCollectFilesPhaseFileList.txt 檔案會列出在刪除指定排除的任何檔案之前 MSBuild 收集用於封裝的檔案。

  • AfterExcludeFilesFilesList.txt 檔案包含移除指定已排除的檔案後修改的檔案清單。

    注意

    有關從封裝程序中排除檔案和資料夾的詳細資訊,請參閱「從部署中排除檔案和資料夾」。

  • AfterTransformWebConfig.txt 檔案會列出在執行任何 Web.config 轉換後收集的用於封裝的檔案。 在此清單中,任何特定於設定的 Web.config 轉換檔案 (如 Web.Debug.configWeb.Release.config) 都會從封裝檔案清單中排除。 一個轉換後的 Web.config 包含在其位置中。

  • PostAutoParameterizationWebConfigConnectionStrings.txt 檔案包含 Web.config 檔案中的連接字串參數化後的檔案清單。 透過此程序,您可以在部署套件時將連接字串替換為目標環境的正確設定。

  • Prepackage.txt 檔案包含了要包含在封裝中的最終預建檔案清單。

注意

附加記錄檔案的名稱通常對應於 WPP 目標。 您可以透過檢查 %PROGRAMFILES(x86)%\MSBuild\Microsoft\VisualStudio\v10.0\Web 資料夾中的 Microsoft.Web.Publishing.targets 檔案來查看這些目標。

如果您的網站封裝內容與預期不符,檢查這些檔案可以幫助您找出過程中出現問題的階段。

結論

本主題描述了如何在 MSBuild 中使用 EnablePackageProcessLoggingAndAssert 屬性疑難排解封裝過程中的問題。 它解釋了向建置程序提供屬性值的不同方式,並描述了將屬性設為 True 時記錄的附加資訊。

深入閱讀

若想進一步了解如何使用自訂 MSBuild 專案檔案來控制部署程序,請參閱「了解專案檔案」和「了解建置程序」。 有關 WPP 及其如何管理封裝程序的更多資訊,請參閱「建置和封裝 Web 應用程式專案」。 有關如何從 Web 部署套件中排除特定檔案和資料夾的指南,請參閱「從部署中排除檔案和資料夾」。