針對封裝程序進行疑難排解

作者 :Jason Lee

本主題描述如何使用 Microsoft Build Engine (MSBuild) 中的EnablePackageProcessLoggingAndAssert屬性,收集封裝程式的詳細資訊。

當您將 EnablePackageProcessLoggingAndAssert 屬性設定為 true時,MSBuild 會:

  • 將封裝程式的其他資訊新增至組建記錄。
  • 在某些情況下記錄錯誤,例如,如果在封裝清單中找到重複的檔案。
  • ProjectName_Package 資料夾中建立記錄目錄,並用它來記錄您要封裝之檔案的相關資訊。

如果封裝程式失敗,或您的 Web 部署套件未包含您預期的檔案,您可以使用這項資訊來針對程式進行疑難排解,並找出發生問題的位置。

注意

EnablePackageProcessLoggingAndAssert屬性只有在您使用偵組態建置專案時才有效。 在其他組態中會忽略 屬性。

本主題以名為 Fabrikam, Inc 的虛構公司企業部署需求為基礎,形成一系列教學課程的一部分。本教學課程系列使用範例解決方案連絡人 管理員解決方案來代表具有實際複雜程度的 Web 應用程式,包括 ASP.NET MVC 3 應用程式、Windows Communication Foundation (WCF) 服務和資料庫專案。

這些教學課程的核心部署方法是以 瞭解專案檔中所述的分割專案檔方法為基礎,其中建置程式是由兩個專案檔控制,一個包含適用于每個目的地環境的建置指示,另一個包含環境特定的組建和部署設定。 在建置階段,環境特定的專案檔會合並到與環境無關的專案檔中,以形成一組完整的建置指示。

瞭解 EnablePackageProcessLoggingAndAssert 屬性

建置和封裝 Web 應用程式專案 說明 Web 發佈管線 (WPP) 如何提供一組 MSBuild 目標,擴充 MSBuild 的功能,並讓它與 Internet Information Services (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 引數資料列中提供EnablePackageProcessLoggingAndAssert屬性的值:如果您使用 Team Foundation Server (T F S) 組建定義來建置專案,您可以在 MSBuild 引數中提供 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>

檢閱記錄檔

當您建置並封裝 EnablePackageProcessLoggingAndAssert 設定為 true的 Web 應用程式專案時,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 檔案,以檢閱這些目標。

如果 Web 套件的內容不是您預期的內容,檢閱這些檔案可能是識別程式發生錯誤時間點的實用方式。

結論

本主題描述如何使用 MSBuild 中的 EnablePackageProcessLoggingAndAssert 屬性來針對封裝程式進行疑難排解。 它說明您可以將屬性值提供給建置程式的不同方式,並說明當您將屬性設定為 true時所記錄的其他資訊。

深入閱讀

如需使用自訂 MSBuild 專案檔來控制部署程式的詳細資訊,請參閱 瞭解專案檔瞭解建置程式。 如需 WPP 及其管理封裝程式方式的詳細資訊,請參閱 建置和封裝 Web 應用程式專案。 如需如何從 Web 部署套件排除特定檔案和資料夾的指引,請參閱 從部署中排除檔案和資料夾