Porównanie właściwości i elementów
Właściwości programu MSBuild i elementy zarówno służą do przekazywania informacji do zadań, oceny warunków i przechowywanie wartości, które można się odwoływać w całym pliku projektu.
Właściwości są pary nazwa wartość.Aby uzyskać więcej informacji, zobacz Właściwości programu MSBuild.
Elementy są obiektami, które reprezentują zazwyczaj pliki.Obiekty towaru można skojarzyć kolekcje metadanych.Metadane są pary nazwa wartość.Aby uzyskać więcej informacji, zobacz Elementy programu MSBuild.
Skalary i wektory
Ponieważ właściwości MSBuild pary nazwa wartość, które mają tylko jedną wartość ciągu, często są one opisane jako skalarne.Ponieważ program MSBuild typów elementów listy elementów, są często opisane jako wektor.Jednak w praktyce właściwości może reprezentować wiele wartości i typy elementów może mieć zero lub jeden elementów.
Docelowy wstrzykiwanie zależności
Aby zobaczyć, jak właściwości można przedstawić wiele wartości, należy rozważyć wspólnego wzorca użycia dodawania docelowy do listy cele, które mają zostać zbudowane.Wykaz ten jest zazwyczaj reprezentowany przez wartość właściwości z nazwy docelowej, oddzielając je średnikami.
<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
BuildDependsOn Właściwość jest zazwyczaj używana jako argument docelowy DependsOnTargets atrybut skutecznie konwersji do listy elementów.Właściwość ta może być zastąpiona dodać cel lub zmienić kolejność wykonywania docelowego.Na przykład,
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);
CustomBuild;
</BuildDependsOn>
</PropertyGroup>
dodaje do listy docelowych docelowego CustomBuild podając BuildDependsOn wartość BeforeBuild;CoreBuild;AfterBuild;CustomBuild.
Począwszy od programu MSBuild 4.0 wstrzykiwanie zależności docelowego jest niezalecane.Użyj AfterTargets i BeforeTargets zamiast atrybuty.Aby uzyskać więcej informacji, zobacz Kolejność kompilowania obiektów docelowych.
Konwersje między ciągi i elementu listy
Program MSBuild wykonuje konwersje i typy towarów i wartości ciągu.Aby zobaczyć, jak lista elementów może stać się wartość ciągu, należy rozważyć, co się dzieje, gdy typ elementu jest używana jako wartość właściwości MSBuild:
<ItemGroup>
<OutputDir Include="KeyFiles\;Certificates\" />
</ItemGroup>
<PropertyGroup>
<OutputDirList>@(OutputDir)</OutputDirList>
</PropertyGroup>
Typ elementu ma OutputDir Include atrybutu o wartości "KeyFiles\;Certificates\ ".Program MSBuild analizuje ten ciąg na dwie pozycje: KeyFiles\ i Certificates\.Typ elementu OutputDir jest używana jako wartość właściwości OutputDirList, MSBuild konwertuje lub "spłaszcza" typu elementu w ciągu średnikami "KeyFiles\;Certificates\ ".
Właściwości i elementów zadań
Właściwości i elementy są używane jako wejść i wyjść do zadań programu MSBuild.Aby uzyskać więcej informacji, zobacz Zadania programu MSBuild.
Właściwości są przekazywane do zadań jako atrybuty.W ramach zadania właściwość MSBuild jest reprezentowana przez typ właściwości, których wartość mogą być konwertowane, do i z ciągu.The supported property types include bool, char, DateTime, Decimal, Double, int, string, and any type that ChangeType can handle.
Elementy są przekazywane do zadań jako ITaskItem obiektów.W ramach zadania ItemSpec reprezentuje wartość elementu i GetMetadata pobiera jego metadanych.
Element listy Typ elementu mogą być przekazywane jako tablica ITaskItem obiektów.Począwszy od 3,5.NET Framework elementów można usunąć z listy elementów w docelowym za pomocą Remove atrybut.Ponieważ elementów można usunąć z listy elementów, jest możliwe dla typu zero zapasów towaru.Jeśli lista elementów jest przekazywana z zadaniem tej możliwości należy sprawdzić kod w zadaniu.
Właściwości i kolejność elementów oceny
Podczas fazy oceny kompilacji importowane pliki są włączone do kompilacji w kolejności.Właściwości i elementy są zdefiniowane w trzech przebiegów w następującej kolejności:
Właściwości są zdefiniowane i modyfikowane w kolejności.
Definicja i modyfikowane w kolejności definicji elementu.
Elementy są zdefiniowane i modyfikowane w kolejności.
Podczas fazy wykonanie kompilacji właściwości i elementy, które są zdefiniowane w ramach celów są oceniane razem w pojedynczej fazy w kolejności.
Jednak to nie jest pełny wątku.Jego wartość jest szacowana, zdefiniowane właściwości, definicja elementu lub elementu.Oceniający wyrażenie rozwija ciąg, który określa wartość.Rozszerzenia ciągu zależy na etapie kompilacji.Oto bardziej szczegółowe kolejność oceny właściwości i elementu:
Podczas fazy oceny kompilacji:
Właściwości są zdefiniowane i modyfikowane w kolejności.Właściwość funkcje są wykonywane.Wartości właściwości w $(PropertyName) formie są rozwinięte w wyrażeniach.Wyrażenie rozwiniętej ustawiono wartość właściwości.
Definicja i modyfikowane w kolejności definicji elementu.W wyrażeniach już zostały rozszerzone funkcje właściwości.Wartości metadanych są ustawione na rozwiniętej wyrażeń.
Typy towarów są określone i modyfikowane w kolejności.Wartości elementu @(ItemType) formularza są rozwinięte.Element przekształceń również są rozwinięte.Już zostały rozszerzone funkcje właściwości i wartości w wyrażeniach.Element listy i metadanych wartości są ustawione na rozwiniętej wyrażeń.
Podczas fazy wykonanie kompilacji:
- Właściwości i elementy, które są zdefiniowane w ramach celów są oceniane razem w kolejności.Wykonywane są funkcje właściwości i wartości właściwości są rozwinięte w wyrażeniach.Wartości zapasów i element przekształceń również rozwinięta.Wartości właściwości, wartości typu towaru i wartości metadanych są ustawione na rozwiniętej wyrażeń.
Subtelnych efektów kolejność oceny
W fazie oceny kompilacji oceny właściwości poprzedza oceny elementu.Jednakże właściwości może mieć wartości, które wydają się zależą od wartości elementu.Należy rozważyć następujący skrypt.
<ItemGroup>
<KeyFile Include="KeyFile.cs">
<Version>1.0.0.3</Version>
</KeyFile>
</ItemGroup>
<PropertyGroup>
<KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
</PropertyGroup>
<Target Name="AfterBuild">
<Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>
Wykonywanie zadań komunikat wyświetla ten komunikat:
KeyFileVersion: 1.0.0.3
Wynika to wartość KeyFileVersion jest faktycznie ciągiem "@ (KeyFile - > % (wersja))".Element i element przekształceń nie zostały rozwinięte, gdy właściwość najpierw została zdefiniowana, więc KeyFileVersion właściwość została przypisana wartość ciągu nierozwinięta.
Podczas fazy wykonanie budowanie podczas przetwarzania zadania wiadomości MSBuild rozwija ciąg "@ (KeyFile - > % (wersja))" do "1.0.0.3" plon.
Należy zauważyć, że nawet jeśli właściwość i element grupy zostały cofnięte w kolejności wydaje się ten sam komunikat.
W drugim przykładzie należy rozważyć, co może się zdarzyć, gdy właściwość i element grupy znajdują się w cele:
<Target Name="AfterBuild">
<PropertyGroup>
<KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
</PropertyGroup>
<ItemGroup>
<KeyFile Include="KeyFile.cs">
<Version>1.0.0.3</Version>
</KeyFile>
</ItemGroup>
<Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>
Zadanie komunikat wyświetla ten komunikat:
KeyFileVersion:
Ponieważ w fazie realizacji budowanie, właściwości i elementu grup zdefiniowanych w cele są oceniane jest od góry do dołu, w tym samym czasie.Gdy KeyFileVersion jest zdefiniowany, KeyFile jest nieznany.Dlatego transformacji elementu rozszerza się na pusty ciąg.
W przypadku odwrócenie kolejności grup właściwości i elementu przywraca oryginalną wiadomość:
<Target Name="AfterBuild">
<ItemGroup>
<KeyFile Include="KeyFile.cs">
<Version>1.0.0.3</Version>
</KeyFile>
</ItemGroup>
<PropertyGroup>
<KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
</PropertyGroup>
<Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>
Wartość KeyFileVersion jest ustawiona na "1.0.0.3", a nie "@ (KeyFile - > % (wersja))".Zadanie komunikat wyświetla ten komunikat:
KeyFileVersion: 1.0.0.3