Użycie tej samej wartości docelowej w wielu plikach projektów

Jeśli utworzono kilka plików projektu MSBuild, być może okazało się, że musisz użyć tych samych zadań i obiektów docelowych w różnych plikach projektu. Zamiast zawierać pełny opis tych zadań lub obiektów docelowych w każdym pliku projektu, można zapisać element docelowy w osobnym pliku projektu, a następnie zaimportować ten projekt do dowolnego innego projektu, który musi używać obiektu docelowego.

Korzystanie z elementu Import

Element Import służy do wstawiania jednego pliku projektu do innego pliku projektu. Importowany plik projektu musi być prawidłowym plikiem projektu MSBuild i zawiera poprawnie sformułowany kod XML. Atrybut Project określa ścieżkę do zaimportowanych plików projektu. Aby uzyskać więcej informacji na Import temat elementu, zobacz Import, element (MSBuild).

Aby zaimportować projekt

  1. Zdefiniuj we zaimportowaniu pliku projektu wszystkie właściwości i elementy, które są używane jako parametry właściwości i elementów w zaimportowanych projektach.

  2. Import Za pomocą elementu zaimportuj projekt. Na przykład:

    <Import Project="MyCommon.targets"/>

  3. Zgodnie z elementem zdefiniuj Import wszystkie właściwości i elementy, które muszą zastąpić domyślne definicje właściwości i elementów w zaimportowanych projektach.

Kolejność obliczania

Gdy program MSBuild osiągnie Import element, zaimportowany projekt jest skutecznie wstawiany do projektu importu w lokalizacji Import elementu. W związku z tym lokalizacja Import elementu może mieć wpływ na wartości właściwości i elementów. Ważne jest, aby zrozumieć właściwości i elementy ustawione przez zaimportowany projekt oraz właściwości i elementy używane przez zaimportowany projekt.

Gdy projekt zostanie skompilowany, wszystkie właściwości zostaną najpierw ocenione, a następnie elementy. Na przykład następujący kod XML definiuje zaimportowany plik projektu MyCommon.targets:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>MyCommon</Name>
    </PropertyGroup>

    <Target Name="Go">
        <Message Text="Name=$(Name)"/>
    </Target>
</Project>

Poniższy kod XML definiuje plik MyApp.proj, który importuje obiekty MyCommon.targets:

<Project
    DefaultTargets="Go"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>MyApp</Name>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>

Po skompilowania projektu zostanie wyświetlony następujący komunikat:

Name="MyCommon"

Ponieważ projekt jest importowany po zdefiniowaniu właściwości Name w pliku MyApp.proj, definicja Name elementu w pliku MyCommon.targets zastępuje definicję w pliku MyApp.proj. Jeśli projekt zostanie zaimportowany przed zdefiniowaną właściwością Name, kompilacja wyświetli następujący komunikat:

Name="MyApp"

Podczas importowania projektów należy użyć następującego podejścia

  1. Zdefiniuj w pliku projektu wszystkie właściwości i elementy, które są używane jako parametry właściwości i elementów w zaimportowanych projektach.

  2. Zaimportuj projekt.

  3. Zdefiniuj w pliku projektu wszystkie właściwości i elementy, które muszą zastąpić domyślne definicje właściwości i elementów w importowanym projekcie.

Przykład 1

Poniższy przykład kodu przedstawia plik MyCommon.targets importujący drugi przykład kodu. Plik targets ocenia właściwości z projektu importowania w celu skonfigurowania kompilacji.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
        <Optimize Condition="'$(Flavor)'=='RETAIL'">yes</Optimize>
        <appname>$(MSBuildProjectName)</appname>
    <PropertyGroup>
    <Target Name="Build">
        <Csc Sources="hello.cs"
            Optimize="$(Optimize)"
            OutputAssembly="$(appname).exe"/>
    </Target>
</Project>

Przykład 2

Poniższy przykładowy kod importuje plik MyCommon.targets .

<Project DefaultTargets="Build"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Flavor>RETAIL</Flavor>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>