Vysvětlení souboru projektu

Jason Lee

Microsoft Build Engine soubory projektu (MSBuild) jsou jádrem procesu sestavení a nasazení. Toto téma začíná koncepčním přehledem nástroje MSBuild a souboru projektu. Popisuje klíčové komponenty, se kterými se setkáte při práci se soubory projektu, a funguje na příkladu použití souborů projektu k nasazení reálných aplikací.

Naučíte se:

  • Jak nástroj MSBuild používá soubory projektu MSBuild k sestavení projektů.
  • Způsob integrace nástroje MSBuild s technologiemi nasazení, jako je nástroj pro nasazení webu Internetové informační služby (IIS) (Nasazení webu).
  • Jak porozumět klíčovým komponentám souboru projektu.
  • Jak můžete pomocí souborů projektu sestavovat a nasazovat složité aplikace.

MSBuild a soubor projektu

Při vytváření a sestavování řešení v sadě Visual Studio používá Visual Studio k sestavení jednotlivých projektů v řešení nástroj MSBuild. Každý projekt sady Visual Studio obsahuje soubor projektu MSBuild s příponou souboru, která odpovídá typu projektu – například projekt jazyka C# (.csproj), projekt Visual Basic.NET (.vbproj) nebo databázový projekt (.dbproj). Aby bylo možné sestavit projekt, nástroj MSBuild musí zpracovat soubor projektu přidružený k projektu. Soubor projektu je dokument XML, který obsahuje všechny informace a pokyny, které nástroj MSBuild potřebuje k sestavení projektu, jako je obsah, který se má zahrnout, požadavky na platformu, informace o správě verzí, nastavení webového serveru nebo databázového serveru a úkoly, které je třeba provést.

Soubory projektu MSBuild jsou založeny na schématu XML nástroje MSBuild, a proto je proces sestavení zcela otevřený a transparentní. Kromě toho nemusíte instalovat Visual Studio, abyste mohli používat modul MSBuild – spustitelný soubor MSBuild.exe je součástí rozhraní .NET Framework a můžete ho spustit z příkazového řádku. Jako vývojář si můžete vytvořit vlastní soubory projektu MSBuild pomocí schématu XML nástroje MSBuild, abyste měli sofistikovanou a jemně odstupňovanou kontrolu nad tím, jak jsou vaše projekty sestaveny a nasazovány. Tyto vlastní soubory projektu fungují přesně stejným způsobem jako soubory projektu, které sada Visual Studio generuje automaticky.

Poznámka

Soubory projektu MSBuild můžete také použít se službou Team Build na Team Foundation Serveru (TFS). Soubory projektu můžete například použít ve scénářích kontinuální integrace (CI) k automatizaci nasazení do testovacího prostředí, když se vrátí nový kód se změnami. Další informace najdete v tématu Konfigurace sady Team Foundation Server pro automatizované nasazení webu.

Zásady vytváření názvů souborů projektu

Když vytváříte vlastní soubory projektu, můžete použít libovolnou příponu souboru, která se vám líbí. Pokud ale chcete, aby vaše řešení lépe pochopili ostatní, měli byste použít tyto běžné konvence:

  • Při vytváření souboru projektu, který vytváří projekty, použijte příponu .proj.
  • Při vytváření opakovaně použitelného souboru projektu pro import do jiných souborů projektu použijte příponu .targets. Soubory s příponou .targets obvykle samy o sobě nic nevytvořily, jednoduše obsahují pokyny, které můžete importovat do souborů .proj.

Integrace s technologiemi nasazení

Pokud jste pracovali s projekty webových aplikací v sadě Visual Studio 2010, jako je ASP.NET webových aplikací a ASP.NET webových aplikací MVC, budete vědět, že tyto projekty obsahují integrovanou podporu balení a nasazení webové aplikace do cílového prostředí. Stránky Vlastnosti pro tyto projekty zahrnují karty Zabalit/Publikovat web a Balíček/Publikovat SQL , které můžete použít ke konfiguraci způsobu balení a nasazení komponent aplikace. Zobrazí se karta Package/Publish Web (Balíček/Publikovat web ):

Karta Balíček/Publikování webu

Základní technologie těchto možností se označuje jako kanál publikování na webu (WPP). WPP v podstatě spojuje NÁSTROJE MSBuild a Nasazení webu , aby poskytovaly kompletní proces sestavení, balíčku a nasazení webových aplikací.

Dobrou zprávou je, že můžete využít integrační body, které WPP poskytuje při vytváření vlastních souborů projektu pro webové projekty. Do souboru projektu můžete zahrnout pokyny k nasazení, které vám umožní sestavovat projekty, vytvářet balíčky pro nasazení webu a instalovat tyto balíčky na vzdálené servery prostřednictvím jednoho souboru projektu a jednoho volání nástroje MSBuild. V rámci procesu sestavení můžete také volat jakékoli jiné spustitelné soubory. Můžete například spustit nástroj VSDBCMD.exe příkazového řádku a nasadit databázi ze souboru schématu. V průběhu tohoto tématu se dozvíte, jak můžete tyto funkce využít ke splnění požadavků ve scénářích podnikového nasazení.

Poznámka

Další informace o tom, jak proces nasazení webové aplikace funguje, najdete v tématu ASP.NET Přehled nasazení projektu webové aplikace.

Anatomie souboru projektu

Než se na proces sestavení podíváte podrobněji, měli byste se chvíli seznámit se základní strukturou souboru projektu MSBuild. Tato část obsahuje přehled běžných prvků, se kterými se setkáte při prohlížení, úpravách nebo vytváření souboru projektu. Konkrétně se naučíte:

  • Použití vlastností ke správě proměnných pro proces sestavení
  • Jak pomocí položek identifikovat vstupy do procesu sestavení, jako jsou soubory kódu.
  • Jak používat cíle a úkoly k poskytování pokynů ke spuštění nástroji MSBuild pomocí vlastností a položek definovaných jinde v souboru projektu.

Zobrazí se vztah mezi klíčovými prvky v souboru projektu MSBuild:

Vztah mezi klíčovými prvky v souboru projektu MSBuild.

The Project Element

Element Project je kořenový prvek každého souboru projektu. Kromě identifikace schématu XML pro soubor projektu může element Project obsahovat atributy pro určení vstupních bodů pro proces sestavení. Například v ukázkovém řešení Správce kontaktů soubor Publish.proj určuje, že sestavení by mělo začít voláním cíle s názvem FullPublish.

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

Vlastnosti a podmínky

Soubor projektu obvykle potřebuje k úspěšnému sestavení a nasazení projektů spoustu různých informací. Tyto informace můžou zahrnovat názvy serverů, připojovací řetězce, přihlašovací údaje, konfigurace sestavení, cesty ke zdrojovým a cílovým souborům a jakékoli další informace, které chcete zahrnout pro podporu přizpůsobení. V souboru projektu musí být vlastnosti definovány v elementu PropertyGroup . Vlastnosti nástroje MSBuild se skládají z párů klíč-hodnota. V elementu PropertyGroup název elementu definuje klíč vlastnosti a obsah elementu definuje hodnotu vlastnosti. Můžete například definovat vlastnosti s názvy ServerName a ConnectionString pro uložení názvu statického serveru a připojovací řetězec.

<PropertyGroup>    
   <ServerName>FABRIKAM\TEST1</ServerName>
   <ConnectionString>
     Data Source=FABRIKAM\TESTDB;InitialCatalog=ContactManager,...
   </ConnectionString>
</PropertyGroup>

Pokud chcete načíst hodnotu vlastnosti, použijte formát $(PropertyName). Pokud například chcete načíst hodnotu vlastnosti Název_ serveru, zadejte:

$(ServerName)

Poznámka

Příklady použití hodnot vlastností najdete dále v tomto tématu.

Vložení informací jako statických vlastností do souboru projektu není vždy ideální přístup ke správě procesu sestavení. V mnoha scénářích budete chtít získat informace z jiných zdrojů nebo umožnit uživateli poskytovat informace z příkazového řádku. Nástroj MSBuild umožňuje zadat libovolnou hodnotu vlastnosti jako parametr příkazového řádku. Uživatel může například zadat hodnotu Název_serveru , když spustí MSBuild.exe z příkazového řádku.

msbuild.exe Publish.proj /p:ServerName=FABRIKAM\TESTWEB1

Poznámka

Další informace o argumentech a přepínačích, které můžete s MSBuild.exe použít, najdete v tématu Referenční informace k příkazovému řádku nástroje MSBuild.

Stejnou syntaxi vlastností můžete použít k získání hodnot proměnných prostředí a předdefinovaných vlastností projektu. Spousta běžně používaných vlastností je definována za vás a můžete je použít v souborech projektu zahrnutím příslušného názvu parametru. Pokud například chcete načíst aktuální platformu projektu, například x86 nebo AnyCpu, můžete do souboru projektu zahrnout odkaz na vlastnost $(Platform). Další informace najdete v tématech Makra pro příkazy a vlastnosti sestavení, Běžné vlastnosti projektu MSBuild a Rezervované vlastnosti.

Vlastnosti se často používají ve spojení s podmínkami. Většina elementů nástroje MSBuild podporuje atribut Condition , který umožňuje určit kritéria, podle kterých by nástroj MSBuild měl element vyhodnotit. Představte si například tuto definici vlastnosti:

<PropertyGroup>
   <OutputRoot Condition=" '$(OutputRoot)'=='' ">..\Publish\Out\</OutputRoot>
   ...
</PropertyGroup>

Když nástroj MSBuild zpracuje tuto definici vlastnosti, nejprve zkontroluje, zda je k dispozici hodnota vlastnosti $(OutputRoot). Pokud je hodnota vlastnosti prázdná – jinými slovy, uživatel nezadá hodnotu pro tuto vlastnost – podmínka se vyhodnotí jako true a hodnota vlastnosti je nastavená na hodnotu .. \Publikovat\Out. Pokud uživatel zadal hodnotu pro tuto vlastnost, podmínka se vyhodnotí jako false a hodnota statické vlastnosti se nepoužije.

Další informace o různých způsobech zadávání podmínek najdete v tématu Podmínky nástroje MSBuild.

Položky a skupiny položek

Jednou z důležitých rolí souboru projektu je definování vstupů do procesu sestavení. Tyto vstupy jsou obvykle soubory – soubory kódu, konfigurační soubory, soubory příkazů a všechny další soubory, které potřebujete zpracovat nebo zkopírovat v rámci procesu sestavení. Ve schématu projektu MSBuild jsou tyto vstupy reprezentovány elementy Item . V souboru projektu musí být položky definovány v elementu ItemGroup . Stejně jako elementy vlastnosti můžete element Item pojmenovat, jak chcete. Je však nutné zadat atribut Include , který identifikuje soubor nebo zástupný znak, který položka představuje.

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

Zadáním více elementů Item se stejným názvem ve skutečnosti vytváříte pojmenovaný seznam prostředků. Dobrý způsob, jak to vidět v akci, je podívat se do jednoho ze souborů projektu, které Visual Studio vytvoří. Například soubor ContactManager.Mvc.csproj v ukázkovém řešení obsahuje mnoho skupin položek, z nichž každá má několik identicky pojmenovaných elementů Item .

<ItemGroup>
   <Reference Include="Microsoft.CSharp" />
   <Reference Include="System.Runtime.Serialization" />
   <Reference Include="System.ServiceModel" />
   ...
</ItemGroup>
<ItemGroup>
   <Compile Include="Controllers\AccountController.cs" />
   <Compile Include="Controllers\ContactsController.cs" />
   <Compile Include="Controllers\HomeController.cs" />
   ...
</ItemGroup>
<ItemGroup>
   <Content Include="Content\Custom.css" />
   <Content Include="CreateDatabase.sql" />
   <Content Include="DropDatabase.sql" />
   ...
</ItemGroup>

Tímto způsobem soubor projektu dává nástroji MSBuild pokyn, aby sestavil seznamy souborů, které je třeba zpracovat stejným způsobem – seznam Reference obsahuje sestavení, která musí být na místě pro úspěšné sestavení, seznam Kompilovat obsahuje soubory kódu, které je třeba zkompilovat, a seznam Obsah obsahuje prostředky, které musí být zkopírovány beze úprav. Na to, jak proces sestavení odkazuje a používá tyto položky, se podíváme dále v tomto tématu.

Elementy položky mohou také obsahovat podřízené elementy ItemMetadata . Jedná se o uživatelem definované páry klíč-hodnota a v podstatě představují vlastnosti, které jsou specifické pro danou položku. Například mnoho elementů položky kompilace v souboru projektu obsahuje podřízené elementy DependentUpon .

<Compile Include="Global.asax.cs">
   <DependentUpon>Global.asax</DependentUpon>
</Compile>

Poznámka

Kromě metadat položek vytvořených uživatelem jsou všem položkám při vytváření přiřazena různá společná metadata. Další informace najdete v tématu Dobře známá metadata položky.

Elementy ItemGroup můžete vytvořit v elementu Projektu kořenové úrovně nebo v rámci konkrétních cílových elementů. Elementy ItemGroup také podporují atributy condition, které umožňují přizpůsobit vstupy procesu sestavení podle podmínek, jako je konfigurace projektu nebo platforma.

Cíle a úkoly

Ve schématu NÁSTROJE MSBuild představuje element Task jednotlivé instrukce sestavení (nebo úlohu). NÁSTROJ MSBuild obsahuje velké množství předdefinovaných úloh. Příklad:

  • Úloha Kopírovat zkopíruje soubory do nového umístění.
  • Úloha CSC vyvolá kompilátor Visual C#.
  • Úloha Vbc vyvolá kompilátor jazyka Visual Basic.
  • Úloha Exec spustí zadaný program.
  • Úloha Zpráva zapíše zprávu do protokolovacího nástroje.

Poznámka

Úplné podrobnosti o úlohách, které jsou k dispozici, najdete v tématu Referenční informace k úkolům nástroje MSBuild. Další informace o úkolech, včetně postupu při vytváření vlastních úkolů, najdete v tématu Úlohy nástroje MSBuild.

Úkoly musí být vždy obsaženy v cílových prvech. Target element je sada jednoho nebo více úkolů, které se provádějí postupně a soubor projektu může obsahovat více cílů. Pokud chcete spustit úlohu nebo sadu úkolů, vyvoláte cíl, který je obsahuje. Předpokládejme například, že máte jednoduchý soubor projektu, který protokoluje zprávu.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Target Name="LogMessage">
      <Message Text="Hello world!" />
   </Target>
</Project>

Cíl můžete vyvolat z příkazového řádku pomocí přepínače /t a určit cíl.

msbuild.exe Publish.proj /t:LogMessage

Případně můžete do elementu Project přidat atribut DefaultTargets a určit cíle, které chcete vyvolat.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
         DefaultTargets="FullPublish">
   <Target Name="LogMessage">
      <Message Text="Hello world!" />
   </Target>
</Project>

V takovém případě nemusíte zadávat cíl z příkazového řádku. Můžete jednoduše zadat soubor projektu a nástroj MSBuild za vás vyvolá cíl FullPublish .

msbuild.exe Publish.proj

Cíle i úkoly můžou obsahovat atributy podmínky . Proto se můžete rozhodnout vynechat celé cíle nebo jednotlivé úkoly, pokud jsou splněny určité podmínky.

Obecně řečeno, když vytváříte užitečné úkoly a cíle, budete muset odkazovat na vlastnosti a položky, které jste definovali jinde v souboru projektu:

  • Pokud chcete použít hodnotu vlastnosti, zadejte $(PropertyName), kde PropertyName je název elementu Property nebo název parametru.
  • Chcete-li použít položku, zadejte @(ItemName), kde ItemName je název elementu Item .

Poznámka

Mějte na paměti, že pokud vytvoříte více položek se stejným názvem, vytváříte seznam. Pokud naopak vytvoříte více vlastností se stejným názvem, poslední hodnota vlastnosti, kterou zadáte, přepíše všechny předchozí vlastnosti se stejným názvem – vlastnost může obsahovat pouze jednu hodnotu.

Například v souboru Publish.proj v ukázkovém řešení se podívejte na cíl BuildProjects .

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

V této ukázce si můžete všimnout těchto klíčových bodů:

  • Pokud je zadán parametr BuildingInTeamBuild s hodnotou true, nebudou provedeny žádné úlohy v rámci tohoto cíle.

  • Cíl obsahuje jednu instanci úlohy MSBuild . Tato úloha umožňuje vytvářet další projekty NÁSTROJE MSBuild.

  • Položka ProjectsToBuild je předána úkolu. Tato položka může představovat seznam souborů projektu nebo řešení, které jsou definovány elementy položky ProjectsToBuild v rámci skupiny položek. V tomto případě položka ProjectsToBuild odkazuje na jeden soubor řešení.

    <ItemGroup>
       <ProjectsToBuild Include="$(SourceRoot)ContactManager-WCF.sln"/>
    </ItemGroup>
    
  • Hodnoty vlastností předané do úlohy MSBuild zahrnují parametry s názvy OutputRoot a Configuration. Jsou nastaveny na hodnoty parametrů, pokud jsou zadané, nebo hodnoty statických vlastností, pokud nejsou.

    <PropertyGroup>
       ... 
       <Configuration Condition=" '$(Configuration)'=='' ">Release
       </Configuration>
       <OutputRoot Condition=" '$(OutputRoot)'=='' ">..\Publish\Out\
       </OutputRoot>
       ...
    </PropertyGroup>
    

Můžete také vidět, že úloha MSBuild vyvolá cíl s názvem Build. Jedná se o jeden z několika předdefinovaných cílů, které se široce používají v souborech projektu sady Visual Studio a jsou dostupné ve vlastních souborech projektu, jako jsou sestavení, vyčištění, opětovné sestavení a publikování. Další informace o používání cílů a úkolů k řízení procesu sestavení a zejména o úloze NÁSTROJE MSBuild se dozvíte dále v tomto tématu.

Poznámka

Další informace o cílech najdete v tématu Cíle nástroje MSBuild.

Rozdělení souborů projektu pro podporu více prostředí

Předpokládejme, že chcete mít možnost nasadit řešení do více prostředí, jako jsou testovací servery, pracovní platformy a produkční prostředí. Konfigurace se může v jednotlivých prostředích výrazně lišit , a to nejen z hlediska názvů serverů, připojovacích řetězců atd., ale také potenciálně z hlediska přihlašovacích údajů, nastavení zabezpečení a mnoha dalších faktorů. Pokud to potřebujete dělat pravidelně, není ve skutečnosti vhodné upravovat více vlastností v souboru projektu pokaždé, když přepnete cílové prostředí. Stejně tak není ideálním řešením vyžadovat, aby proces sestavení poskytoval nekonečný seznam hodnot vlastností.

Naštěstí existuje alternativa. NÁSTROJ MSBuild umožňuje rozdělit konfiguraci sestavení do více souborů projektu. Pokud chcete zjistit, jak to funguje, všimněte si v ukázkovém řešení, že existují dva vlastní soubory projektu:

  • Publish.proj, který obsahuje vlastnosti, položky a cíle, které jsou společné pro všechna prostředí.
  • Env-Dev.proj, který obsahuje vlastnosti, které jsou specifické pro vývojářské prostředí.

Teď si všimněte, že soubor Publish.proj obsahuje element Import hned pod úvodní značkou Projectu .

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

Import element se používá k importu obsahu jiného souboru projektu MSBuild do aktuálního souboru projektu MSBuild. V tomto případě parametr TargetEnvPropsFile poskytuje název souboru projektu, který chcete importovat. Hodnotu tohoto parametru můžete zadat při spuštění nástroje MSBuild.

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

Tím se obsah těchto dvou souborů sloučí do jednoho souboru projektu. Pomocí tohoto přístupu můžete vytvořit jeden soubor projektu obsahující konfiguraci univerzálního sestavení a několik doplňkových souborů projektu obsahujících vlastnosti specifické pro prostředí. Výsledkem je, že spuštění příkazu s jinou hodnotou parametru vám umožní nasadit řešení do jiného prostředí.

Spuštění příkazu s jinou hodnotou parametru vám umožní nasadit řešení do jiného prostředí.

Rozdělení souborů projektu tímto způsobem je vhodné dodržovat. Umožňuje vývojářům nasadit do více prostředí spuštěním jednoho příkazu a zároveň zabránit duplikaci vlastností univerzálního sestavení napříč několika soubory projektu.

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í.

Závěr

Toto téma poskytlo obecný úvod k souborům projektu MSBuild a vysvětlilo, jak můžete vytvořit vlastní soubory projektu pro řízení procesu sestavení. Zavedla také koncept rozdělení souborů projektu na univerzální pokyny k sestavení a vlastnosti sestavení specifické pro prostředí, aby bylo snadné sestavovat a nasazovat projekty do více cílů.

Další téma Principy procesu sestavení poskytuje lepší přehled o tom, jak můžete pomocí souborů projektu řídit sestavení a nasazení tím, že vás provede nasazením řešení s realistickou úrovní složitosti.

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.