Sdílet prostřednictvím


Vysvětlení procesu sestavení

Jason Lee

Toto téma obsahuje návod k procesu sestavení a nasazení na podnikové úrovni. Přístup popsaný v tomto tématu používá vlastní soubory projektu Microsoft Build Engine (MSBuild) k zajištění podrobné kontroly nad každou stránkou procesu. V souborech projektu se vlastní cíle MSBuild používají ke spuštění nástrojů pro nasazení, jako je nástroj pro nasazení webu Internetové informační služby (IIS) (MSDeploy.exe) a nástroj pro nasazení databáze VSDBCMD.exe.

Poznámka

V předchozím tématu Understanding the Project File (Principy souboru projektu) jsme popsali klíčové komponenty souboru projektu MSBuild a představili koncept rozdělených souborů projektu pro podporu nasazení do více cílových prostředí. Pokud tyto koncepty ještě neznáte, měli byste si před zahájením práce s tímto tématem projít téma Principy souboru projektu .

Toto téma je součástí série kurzů založených na požadavcích na podnikové nasazení fiktivní společnosti s názvem Fabrikam, Inc. Tato série kurzů používá ukázkové řešení – řešení Contact Manager – k reprezentaci webové aplikace s realistickou úrovní složitosti, včetně aplikace ASP.NET MVC 3, služby WCF (Windows Communication Foundation) a databázového projektu.

Metoda nasazení, která je jádrem těchto kurzů, je založená na přístupu založeném na rozdělených souborech projektu popsaném v tématu Vysvětlení souboru projektu, ve kterém je proces sestavení řízen dvěma soubory projektu – jedním obsahujícím pokyny k sestavení, které platí pro každé cílové prostředí, a jedním obsahujícím nastavení sestavení a nasazení specifické pro prostředí. V době sestavení se soubor projektu specifického pro prostředí sloučí do souboru projektu nezávislého na prostředí, aby se vytvořila úplná sada pokynů k sestavení.

Přehled sestavení a nasazení

V řešení Contact Manager řídí proces sestavení a nasazení tři soubory:

  • Univerzální soubor projektu (Publish.proj). Obsahuje pokyny k sestavení a nasazení, které se mezi cílovými prostředími nemění.
  • Soubor projektu specifického pro prostředí (Env-Dev.proj). Obsahuje nastavení sestavení a nasazení, která jsou specifická pro konkrétní cílové prostředí. Můžete například použít soubor Env-Dev.proj k poskytnutí nastavení pro vývojářské nebo testovací prostředí a vytvořit alternativní soubor s názvem Env-Stage.proj , který poskytne nastavení pro přípravné prostředí.
  • Soubor příkazu (Publish-Dev.cmd). Obsahuje MSBuild.exe příkaz, který určuje, které soubory projektu chcete spustit. Můžete vytvořit soubor příkazu pro každé cílové prostředí, kde každý soubor obsahuje MSBuild.exe příkaz, který určuje jiný soubor projektu pro konkrétní prostředí. To umožňuje vývojáři nasadit do různých prostředí jednoduše spuštěním příslušného souboru příkazu.

V ukázkovém řešení najdete tyto tři soubory ve složce Publikovat řešení.

V ukázkovém řešení najdete tři soubory ve složce Publikovat řešení.

Než se na tyto soubory podíváte podrobněji, pojďme se při použití tohoto přístupu podívat na to, jak funguje celkový proces sestavení. Na nejvyšší úrovni proces sestavení a nasazení vypadá takto:

Proces sestavení a nasazení vypadá na vysoké úrovni.

První věc, která se stane, je, že dva soubory projektu – jeden obsahuje univerzální pokyny k sestavení a nasazení a jeden obsahující nastavení specifické pro prostředí – se sloučí do jednoho souboru projektu. Nástroj MSBuild pak projde pokyny v souboru projektu. Sestaví každý z projektů v řešení pomocí souboru projektu pro každý projekt. Potom zavolá na další nástroje, jako je Nasazení webu (MSDeploy.exe) a nástroj VSDBCMD pro nasazení webového obsahu a databází do cílového prostředí.

Proces sestavení a nasazení provádí od začátku do konce tyto úlohy:

  1. Odstraní obsah výstupního adresáře v rámci přípravy na nové sestavení.

  2. Sestaví každý projekt v řešení:

    1. U webových projektů – v tomto případě ASP.NET webové aplikace MVC a webové služby WCF – proces sestavení vytvoří balíček nasazení webu pro každý projekt.
    2. U databázových projektů proces sestavení vytvoří manifest nasazení (soubor .deploymanifest) pro každý projekt.
  3. Pomocí nástroje VSDBCMD.exe nasadí každý databázový projekt v řešení pomocí různých vlastností ze souborů projektu – cílového připojovacího řetězce a názvu databáze – společně se souborem .deploymanifest.

  4. K nasazení každého webového projektu v řešení používá nástroj MSDeploy.exe a k řízení procesu nasazení používá různé vlastnosti ze souborů projektu.

K podrobnějšímu trasování tohoto procesu můžete použít ukázkové řešení.

Poznámka

Pokyny k přizpůsobení souborů projektu specifických pro konkrétní prostředí pro vlastní serverová prostředí najdete v tématu Konfigurace vlastností nasazení pro cílové prostředí.

Vyvolání procesu sestavení a nasazení

K nasazení řešení Contact Manager do testovacího prostředí vývojáře vývojář spustí soubor příkazu Publish-Dev.cmd . Tím vyvoláte MSBuild.exe a jako soubor projektu, který se má spustit, zadáte Publish.proj a env-Dev.proj jako hodnotu parametru.

msbuild.exe Publish.proj /fl /p:TargetEnvPropsFile=EnvConfig\Env-Dev.proj

Poznámka

Přepínač /fl (zkratka pro /fileLogger) protokoluje výstup sestavení do souboru s názvem msbuild.log v aktuálním adresáři. Další informace najdete v tématu Referenční informace k příkazovému řádku nástroje MSBuild.

V tomto okamžiku spustí nástroj MSBuild, načte soubor Publish.proj a začne zpracovávat pokyny v něm. První instrukce říká nástroji MSBuild importovat soubor projektu, který určuje parametr TargetEnvPropsFile .

<Import Project="$(TargetEnvPropsFile)" />

Parametr TargetEnvPropsFile určuje soubor Env-Dev.proj , takže MSBuild sloučí obsah souboru Env-Dev.proj do souboru Publish.proj .

Další prvky, se kterými se nástroj MSBuild setká ve sloučené souboru projektu, jsou skupiny vlastností. Vlastnosti se zpracovávají v pořadí, ve kterém se zobrazují v souboru. Nástroj MSBuild vytvoří dvojici klíč-hodnota pro každou vlastnost za předpokladu, že jsou splněny všechny zadané podmínky. Vlastnosti definované dále v souboru přepíší všechny vlastnosti se stejným názvem, které byly v souboru definovány dříve. Zvažte například Vlastnosti OutputRoot .

<OutputRoot Condition=" '$(OutputRoot)'=='' ">..\Publish\Out\</OutputRoot>
<OutputRoot Condition=" '$(BuildingInTeamBuild)'=='true' ">$(OutDir)</OutputRoot>

Když NÁSTROJ MSBuild zpracuje první element OutputRoot a poskytne podobně pojmenovaný parametr nebyl zadán, nastaví hodnotu OutputRoot vlastnost na .. \Publikovat\Out. Když narazí na druhý OutputRoot element, pokud podmínka vyhodnotí na true, přepíše hodnotu OutputRoot vlastnost hodnotou OutDir parametru.

Dalším prvkem, na který msBuild narazí, je jedna skupina položek obsahující položku s názvem ProjectsToBuild.

<ItemGroup>
   <ProjectsToBuild Include="$(SourceRoot)ContactManager-WCF.sln"/>
</ItemGroup>

MSBuild zpracovává tento pokyn sestavením seznamu položek s názvem ProjectsToBuild. V tomto případě seznam položek obsahuje jedinou hodnotu – cestu a název souboru řešení.

V tomto okamžiku jsou zbývající prvky cíle. Cíle se zpracovávají jinak než vlastnosti a položky – v podstatě se cíle nezpracují, pokud nejsou explicitně zadány uživatelem nebo vyvolány jiným konstruktorem v souboru projektu. Vzpomeňte si, že počáteční značka projektu obsahuje atribut DefaultTargets .

<Project ToolsVersion="4.0" 
         DefaultTargets="FullPublish" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

To dává pokyn nástroji MSBuild k vyvolání cíle FullPublish , pokud nejsou cíle zadány při vyvolání MSBuild.exe. Cíl FullPublish neobsahuje žádné úkoly. místo toho jednoduše určuje seznam závislostí.

<PropertyGroup>   
  <FullPublishDependsOn>
     Clean;
     BuildProjects;      
     GatherPackagesForPublishing;
     PublishDbPackages;
     PublishWebPackages;
  </FullPublishDependsOn>
</PropertyGroup>
<Target Name="FullPublish" DependsOnTargets="$(FullPublishDependsOn)" />

Tato závislost říká nástroji MSBuild, že aby bylo možné spustit cíl FullPublish , musí vyvolat tento seznam cílů v uvedeném pořadí:

  1. Musí vyvolat čistý cíl.
  2. Musí vyvolat cíl BuildProjects .
  3. Musí vyvolat cíl GatherPackagesForPublishing .
  4. Musí vyvolat cíl PublishDbPackages .
  5. Musí vyvolat cíl PublishWebPackages .

Čistý cíl

Cíl Vyčištění v podstatě odstraní výstupní adresář a veškerý jeho obsah jako přípravu na nové sestavení.

<Target Name="Clean" Condition=" '$(BuildingInTeamBuild)'!='true' ">
  <Message Text="Cleaning up the output directory [$(OutputRoot)]"/>
  <ItemGroup>
     <_FilesToDelete Include="$(OutputRoot)**\*"/>
  </ItemGroup>
  <Delete Files="@(_FilesToDelete)"/>
  <RemoveDir Directories="$(OutputRoot)"/>
</Target>

Všimněte si, že cíl obsahuje element ItemGroup . Když definujete vlastnosti nebo položky v rámci cílového elementu, vytváříte dynamické vlastnosti a položky. Jinými slovy, vlastnosti nebo položky se nezpracují, dokud se nespustí cíl. Výstupní adresář nemusí existovat nebo obsahovat žádné soubory, dokud proces sestavení nezačíná, takže seznam _FilesToDelete nelze sestavit jako statickou položku; musíte počkat, až bude provádění spuštěno. Proto seznam sestavíte jako dynamickou položku v rámci cíle.

Poznámka

V tomto případě, protože cíl Vyčištění je první, který se spustí, není nutné používat dynamickou skupinu položek. V tomto typu scénáře je ale vhodné používat dynamické vlastnosti a položky, protože někdy můžete chtít spouštět cíle v jiném pořadí.
Měli byste se také snažit vyhnout se deklarování položek, které se nikdy nepoužijí. Pokud máte položky, které bude používat jenom konkrétní cíl, zvažte jejich umístění do cíle, abyste odstranili případné zbytečné režijní náklady na proces sestavení.

Kromě dynamických položek je čistý cíl poměrně jednoduchý a využívá předdefinované úlohy Message, Delete a RemoveDir k:

  1. Odešle zprávu do protokolovacího nástroje.
  2. Vytvořte seznam souborů, které chcete odstranit.
  3. Odstraňte soubory.
  4. Odeberte výstupní adresář.

Cíl BuildProjects

Cíl BuildProjects v podstatě sestaví všechny projekty v ukázkovém řešení.

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

Tento cíl byl podrobně popsán v předchozím tématu Principy souboru projektu, který ilustruje, jak úkoly a cíle odkazují na vlastnosti a položky. V tomto okamžiku vás zajímá hlavně úloha MSBuild . Tuto úlohu můžete použít k sestavení více projektů. Úloha nevytvoří novou instanci MSBuild.exe; K sestavení každého projektu používá aktuálně spuštěnou instanci. Klíčovými body zájmu v tomto příkladu jsou vlastnosti nasazení:

  • Vlastnost Dává nástroji MSBuild pokyn, aby po dokončení sestavení každého projektu spustil všechny pokyny k nasazení v nastavení projektu.
  • Vlastnost identifikuje cíl, který chcete vyvolat po sestavení projektu. V tomto případě cíl balíčku sestaví výstup projektu do nasaditelného webového balíčku.

Poznámka

Cíl balíčku vyvolá kanál publikování na webu (WPP), který poskytuje integraci mezi nástroji MSBuild a Nasazení webu. Pokud se chcete podívat na předdefinované cíle, které WPP poskytuje, zkontrolujte soubor Microsoft.Web.Publishing.targets ve složce %PROGRAMFILES(x86)%\MSBuild\Microsoft\VisualStudio\v10.0\Web.

Cíl GatherPackagesForPublishing

Pokud si projdete cíl GatherPackagesForPublishing , všimnete si, že ve skutečnosti neobsahuje žádné úkoly. Místo toho obsahuje jednu skupinu položek, která definuje tři dynamické položky.

<Target Name="GatherPackagesForPublishing">
   <ItemGroup>
      <PublishPackages 
         Include="$(_ContactManagerDest)ContactManager.Mvc.deploy.cmd">
         <WebPackage>true</WebPackage>
         <!-- More item metadata -->  
      </PublishPackages>
      <PublishPackages 
         Include="$(_ContactManagerSvcDest)ContactManager.Service.deploy.cmd">
         <WebPackage>true</WebPackage>
         <!-- More item metadata -->
      </PublishPackages>
      <DbPublishPackages Include="$(_DbDeployManifestPath)">
         <DbPackage>true</DbPackage>
         <!-- More item metadata -->
      </DbPublishPackages>
   </ItemGroup>
</Target>

Tyto položky odkazují na balíčky nasazení, které byly vytvořeny při spuštění cíle BuildProjects . Tyto položky nelze staticky definovat v souboru projektu, protože soubory, na které položky odkazují, neexistují, dokud se nespustí cíl BuildProjects . Místo toho musí být položky definovány dynamicky v rámci cíle, který není vyvolán, dokud po spuštění cíle BuildProjects .

Položky se v rámci tohoto cíle nepoužívají – tento cíl jednoduše sestaví položky a metadata přidružená ke každé hodnotě položky. Po zpracování těchto prvků bude položka PublishPackages obsahovat dvě hodnoty, cestu k souboru ContactManager.Mvc.deploy.cmd a cestu k souboru ContactManager.Service.deploy.cmd . Nasazení webu vytvoří tyto soubory jako součást webového balíčku pro každý projekt. Jedná se o soubory, které musíte vyvolat na cílovém serveru, aby bylo možné balíčky nasadit. Pokud otevřete některý z těchto souborů, zobrazí se v podstatě příkaz MSDeploy.exe s různými hodnotami parametrů specifických pro sestavení.

Položka DbPublishPackages bude obsahovat jednu hodnotu, cestu k souboru ContactManager.Database.deploymanifest .

Poznámka

Soubor .deploymanifest je generován při sestavení databázového projektu a používá stejné schéma jako soubor projektu MSBuild. Obsahuje všechny informace potřebné k nasazení databáze, včetně umístění schématu databáze (.dbschema) a podrobností o všech skriptech před nasazením a po nasazení. Další informace najdete v tématu Přehled sestavení a nasazení databáze.

Další informace o tom, jak se balíčky nasazení a manifesty nasazení databáze vytvářejí a používají v tématech Sestavování a balení projektů webových aplikací a Nasazování databázových projektů.

Cíl PublishDbPackages

Stručně řečeno, cíl PublishDbPackages vyvolá nástroj VSDBCMD k nasazení databáze ContactManager do cílového prostředí. Konfigurace nasazení databáze zahrnuje spoustu rozhodnutí a drobných odlišností. Více se o tom dozvíte v tématech Nasazení databázových projektů a Přizpůsobení nasazení databáze pro více prostředí. V tomto tématu se zaměříme na to, jak tento cíl skutečně funguje.

Nejprve si všimněte, že počáteční značka obsahuje atribut Outputs .

<Target Name="PublishDbPackages" Outputs="%(DbPublishPackages.Identity)">

Toto je příklad cílového dávkování. V souborech projektu MSBuild je dávkování technika iterace kolekcí. Hodnota atributu Outputs"%(DbPublishPackages.Identity)" odkazuje na vlastnost Metadata identity seznamu položek DbPublishPackages . Tato notace , Outputs=%(ItemList.ItemMetadataName), je přeložená takto:

  • Rozdělte položky v DbPublishPackages do dávek položek, které obsahují stejnou hodnotu metadat identity .
  • Spusťte cíl jednou pro každou dávku.

Poznámka

Identita je jednou z předdefinovaných hodnot metadat , která je přiřazena ke každé položce při vytvoření. Odkazuje na hodnotu atributu Include v elementu Item – jinými slovy na cestu a název souboru položky.

Protože v tomto případě by nikdy nemělo existovat více než jedna položka se stejnou cestou a názvem souboru, pracujeme v podstatě s velikostmi dávky po jedné. Cíl se spustí jednou pro každý databázový balíček.

Podobný zápis můžete vidět ve vlastnosti _Cmd , která sestaví příkaz VSDBCMD s příslušnými přepínači.

<_Cmd>"$(VsdbCmdExe)" 
   /a:Deploy 
   /cs:"%(DbPublishPackages.DatabaseConnectionString)" 
   /p:TargetDatabase=%(DbPublishPackages.TargetDatabase)             
   /manifest:"%(DbPublishPackages.FullPath)" 
   /script:"$(_CmDbScriptPath)" 
   $(_DbDeployOrScript)
</_Cmd>

V tomto případě %(DbPublishPackages.DatabaseConnectionString), %(DbPublishPackages.TargetDatabase) a %(DbPublishPackages.FullPath) odkazují na hodnoty metadat kolekce položek DbPublishPackages . Vlastnost _Cmd je používána úlohou Exec , která vyvolá příkaz .

<Exec Command="$(_Cmd)"/>

Na základě tohoto zápisu vytvoří úloha Exec dávky založené na jedinečných kombinacích hodnot metadat DatabaseConnectionString, TargetDatabase a FullPath a úloha se provede jednou pro každou dávku. Toto je příklad dávkování úkolů. Vzhledem k tomu, že dávkování na úrovni cíle již rozdělilo naši kolekci položek do dávek s jednou položkou, úloha Exec se spustí jednou a pouze jednou pro každou iteraci cíle. Jinými slovy, tato úloha vyvolá nástroj VSDBCMD jednou pro každý databázový balíček v řešení.

Poznámka

Další informace o cílovém dávkování a dávkování úkolů najdete v tématech Dávkování nástroje MSBuild, Metadata položek v cílovém dávkování a Metadata položek v dávkování úkolů.

Cíl PublishWebPackages

V tomto okamžiku jste vyvolali cíl BuildProjects , který vygeneruje balíček nasazení webu pro každý projekt v ukázkovém řešení. Každý balíček doprovází soubor deploy.cmd , který obsahuje příkazy MSDeploy.exe potřebné k nasazení balíčku do cílového prostředí, a souborSetParameters.xml , který určuje nezbytné podrobnosti o cílovém prostředí. Také jste vyvolali cíl GatherPackagesForPublishing , který vygeneruje kolekci položek obsahující soubory deploy.cmd , které vás zajímají. Cíl PublishWebPackages v podstatě provádí tyto funkce:

  • Pracuje se souboremSetParameters.xml pro každý balíček tak, aby obsahoval správné podrobnosti pro cílové prostředí, pomocí úlohy XmlPoke .
  • Vyvolá soubor deploy.cmd pro každý balíček pomocí příslušných přepínačů.

Stejně jako cíl PublishDbPackages i cíl PublishWebPackages používá cílové dávkování, aby se zajistilo, že se cíl provede jednou pro každý webový balíček.

<Target Name="PublishWebPackages" Outputs="%(PublishPackages.Identity)">

V rámci cíle se úloha Exec používá ke spuštění souboru deploy.cmd pro každý webový balíček.

<PropertyGroup>
   <_Cmd>
      %(PublishPackages.FullPath) 
      $(_WhatifSwitch) 
      /M:$(MSDeployComputerName) 
      %(PublishPackages.AdditionalMSDeployParameters)
   </_Cmd>
</PropertyGroup>
<Exec Command="$(_Cmd)"/>

Další informace o konfiguraci nasazení webových balíčků naleznete v tématu Vytváření a balení projektů webových aplikací.

Závěr

Toto téma obsahuje návod, jak se soubory rozděleného projektu používají k řízení procesu sestavení a nasazení od začátku do konce pro ukázkové řešení Contact Manageru. Tento přístup umožňuje spouštět složitá nasazení na podnikové úrovni v jednom opakovatelném kroku jednoduše spuštěním souboru příkazů specifického pro prostředí.

Další čtení

Podrobnější úvod do souborů projektu a WPP najdete v tématu Inside the Microsoft Build Engine: Using MSBuild and Team Foundation Build by Sayed Ibrahim Hashimi and William Bartholomew, ISBN: 978-0-7356-4524-0.