właściwości programu MSBuild
Właściwości to pary nazwa-wartość, których można używać do konfigurowania kompilacji. Stanową przydatny mechanizm przekazywania wartości do zadań, obliczania warunków i przechowywania wartości, do których będą prowadziły odwołania z różnych miejsc pliku projektu.
Definiowanie i odwołuje się do właściwości w pliku projektu
Właściwości są deklarowane przez utworzenie elementu, który ma nazwę właściwości jako element podrzędny elementu PropertyGroup . Na przykład następujący kod XML tworzy właściwość o nazwie BuildDir
, która ma wartość Build
.
<PropertyGroup>
<BuildDir>Build</BuildDir>
</PropertyGroup>
Prawidłowe nazwy właściwości zaczynają się od wielkiej litery lub małych liter lub podkreślenia (_
); prawidłowe kolejne znaki obejmują znaki alfanumeryczne (litery lub cyfry), podkreślenie i łącznik (-
).
W całym pliku projektu właściwości są przywołyne przy użyciu składni $(<PropertyName>)
. Na przykład właściwość w poprzednim przykładzie jest przywołyowana przy użyciu metody $(BuildDir)
.
Wartości właściwości można zmieniać poprzez zmianę definicji właściwości. Poniższy kod XML pozwala nadać nową wartość właściwości BuildDir
:
<PropertyGroup>
<BuildDir>Alternate</BuildDir>
</PropertyGroup>
Właściwości są obliczane w kolejności, w jakiej występują w pliku projektu. Nowa wartość właściwości BuildDir
musi zostać zadeklarowana po przypisaniu starej wartości.
Właściwości zarezerwowane
Program MSBuild rezerwuje niektóre nazwy właściwości do przechowywania informacji o pliku projektu i plikach binarnych MSBuild. Odwołania do tych właściwości tworzy się przy użyciu notacji $, podobnie jak w przypadku pozostałych właściwości. Na przykład odwołanie $(MSBuildProjectFile) zwraca pełną nazwę pliku projektu, łącznie z rozszerzeniem.
Aby uzyskać więcej informacji, zobacz How to: Reference the name or location of the project file and MSBuild reserved and well-known properties (Jak odwoływać się do nazwy lub lokalizacji pliku projektu) oraz MSBuild reserved i dobrze znanych właściwości.
Właściwości wewnętrzne programu MSBuild
Właściwości zdefiniowane w standardowych plikach importu rozpoczynających się od podkreślenia (_) są prywatne dla programu MSBuild i nie powinny być odczytywane, resetowane ani zastępowane w kodzie użytkownika.
Właściwości środowiska
Odwołania do zmiennych środowiskowych w plikach projektów tworzy się tak samo jako odwołania do właściwości zastrzeżonych. Na przykład aby w pliku projektu użyć zmiennej środowiskowej PATH
, należy użyć składni $(Path). Jeśli projekt zawiera definicję właściwości o takiej samej nazwie jak właściwość środowiska, właściwość w projekcie zastępuje wartość zmiennej środowiskowej.
Każdy projekt utworzony w programie MSBuild ma izolowany blok środowiska, tzn. widzi tylko operacje odczytu i zapisu w tym bloku. Program MSBuild odczytuje zmienne środowiskowe tylko podczas inicjowania kolekcji właściwości, przed obliczeniem i skompilowaniem pliku projektu. Wskutek tej operacji właściwości środowiska stają się statyczne, tzn. każde zainicjowane narzędzie na początku używa tych samych nazw i wartości.
Aby uzyskać bieżącą wartość zmiennych środowiskowych z poziomu zduplikowanego narzędzia, użyj funkcji właściwości System.Environment.GetEnvironmentVariable. Jednak preferowaną metodą jest użycie parametru zadania EnvironmentVariables. Właściwości środowiska ustawione w tej tablicy ciągów można przekazywać do zainicjowanego narzędzia bez wpływania na zmienne środowiskowe systemu.
Napiwek
Nie wszystkie zmienne środowiskowe są wczytywane jako właściwości początkowe. Każda zmienna środowiskowa, której nazwa nie jest prawidłową nazwą właściwości MSBuild, taką jak "386", jest ignorowana.
Aby uzyskać więcej informacji, zobacz Instrukcje: używanie zmiennych środowiskowych w kompilacji.
Właściwości rejestru
Wartości rejestru systemu można odczytać przy użyciu następującej składni, gdzie Hive
jest gałąź rejestru (na przykład HKEY_LOCAL_MACHINE), MyKey
jest nazwą klucza, MySubKey
jest nazwą podklucza i Value
jest wartością podklucza.
$(registry:Hive\MyKey\MySubKey@Value)
Aby odczytać domyślną wartość podklucza, należy pominąć Value
.
$(registry:Hive\MyKey\MySubKey)
Ta wartość rejestru może służyć do inicjowania właściwości kompilacji. Na przykład w celu utworzenia właściwości kompilacji reprezentującej stronę główną programu Visual Studio w przeglądarce internetowej, należy użyć następującego kodu:
<PropertyGroup>
<VisualStudioWebBrowserHomePage>
$(registry:HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\WebBrowser@HomePage)
</VisualStudioWebBrowserHomePage>
<PropertyGroup>
Ostrzeżenie
W wersji zestawu .NET SDK programu MSBuild (dotnet build
) właściwości rejestru nie są obsługiwane.
Tworzenie właściwości podczas wykonywania
Właściwościom umieszczonym poza elementami Target
wartości są przypisane w fazie obliczania kompilacji. W następnej fazie (wykonywania) właściwości można tworzyć i modyfikować w następujący sposób:
Właściwość może być emitowana przez dowolne zadanie. Aby emitować właściwość, element Task musi mieć podrzędny element wyjściowy , który ma
PropertyName
atrybut.Właściwość może być emitowana przez zadanie CreateProperty . Takie użycie jest przestarzałe.
Target
elementy mogą zawieraćPropertyGroup
elementy, które mogą zawierać deklaracje właściwości.
Właściwości globalne
Program MSBuild umożliwia ustawianie właściwości w wierszu polecenia przy użyciu przełącznika -property (lub -p). Te globalne wartości właściwości zastępują wartości właściwości ustawione w pliku projektu. Dotyczy to również właściwości środowiska, natomiast nie obejmuje właściwości zastrzeżonych, ponieważ nie można ich modyfikować.
W przykładzie poniżej dla globalnej właściwości Configuration
jest ustawiana wartość DEBUG
.
msbuild.exe MyProj.proj -p:Configuration=DEBUG
Właściwości globalne można także ustawiać i modyfikować dla projektów podrzędnych w kompilacjach wieloprojektowych. Służy do tego atrybut Properties
zadania programu MSBuild. Właściwości globalne są również przekazywane do projektów podrzędnych, chyba że RemoveProperties
atrybut zadania MSBuild jest używany do określenia listy właściwości, które nie mają być przekazywane. Aby uzyskać więcej informacji, zobacz ZADANIE MSBuild.
Właściwości lokalne
Właściwości lokalne można zresetować w projekcie. Właściwości globalne nie mogą. Gdy właściwość lokalna jest ustawiana z wiersza polecenia z -p
opcją , ustawienie w pliku projektu ma pierwszeństwo przed wierszem polecenia.
Właściwość lokalną należy określić przy użyciu atrybutu TreatAsLocalProperty
w tagu projektu.
Poniższy kod określa, że dwie właściwości są lokalne:
<Project Sdk="Microsoft.Net.Sdk" TreatAsLocalProperty="Prop1;Prop2">
Właściwości lokalne nie są przekazywane do projektów podrzędnych w kompilacji wieloprojektowej. Jeśli podasz wartość w wierszu polecenia z -p
opcją, projekty podrzędne otrzymują wartość właściwości globalnej zamiast wartości lokalnej zmienionej w projekcie nadrzędnym, ale projekt podrzędny (lub dowolny z jego importów) może również zmienić ją na własną wartość TreatAsLocalProperty
.
Przykład z właściwościami lokalnymi
W poniższym przykładzie kodu pokazano efekt :TreatAsLocalProperty
<!-- test1.proj -->
<Project TreatAsLocalProperty="TreatedAsLocalProp">
<PropertyGroup>
<TreatedAsLocalProp>LocalOverrideValue</TreatedAsLocalProp>
</PropertyGroup>
<Target Name="Go">
<MSBuild Projects="$(MSBuildThisFileDirectory)\test2.proj" Targets="Go2" Properties="Inner=true" />
</Target>
<Target Name="Go2" BeforeTargets="Go">
<Warning Text="TreatedAsLocalProp($(MSBuildThisFileName)): $(TreatedAsLocalProp)" />
</Target>
</Project>
<!-- test2.proj -->
<Project TreatAsLocalProperty="TreatedAsLocalProp">
<Target Name="Go2">
<Warning Text="TreatedAsLocalProp($(MSBuildThisFileName)): $(TreatedAsLocalProp)" />
</Target>
</Project>
Załóżmy, że kompilujesz wiersz polecenia test1.proj i podajesz TreatedAsLocalProperty
wartość GlobalOverrideValue
globalną :
dotnet msbuild .\test1.proj -p:TreatedAsLocalProp=GlobalOverrideValue
Wynik jest następujący:
test1.proj(11,9): warning : TreatedAsLocalProp(test): LocalOverrideValue
test2.proj(3,9): warning : TreatedAsLocalProp(test2): GlobalOverrideValue
Projekt podrzędny dziedziczy wartość globalną, ale projekt nadrzędny używa właściwości zestawu lokalnego.
Właściwości lokalne i importy
Gdy TreatAsLocalProperty
atrybut jest używany w importowanym projekcie, kolejność jest ważna podczas rozważania, która wartość pobiera właściwość.
Poniższy przykład kodu przedstawia wpływ TreatAsLocalProperty
zaimportowanego projektu:
<!-- importer.proj -->
<Project>
<PropertyGroup>
<TreatedAsLocalProp>FirstOverrideValue</TreatedAsLocalProp>
</PropertyGroup>
<Import Project="import.props" />
<PropertyGroup>
<TreatedAsLocalProp Condition=" '$(TrySecondOverride)' == 'true' ">SecondOverrideValue</TreatedAsLocalProp>
</PropertyGroup>
<Target Name="Go">
<Warning Text="TreatedAsLocalProp($(MSBuildThisFileName)): $(TreatedAsLocalProp)" />
</Target>
</Project>
<!-- import.proj -->
<Project TreatAsLocalProperty="TreatedAsLocalProp">
<PropertyGroup>
<TreatedAsLocalProp>ImportOverrideValue</TreatedAsLocalProp>
</PropertyGroup>
<!-- Here, TreatedAsLocalProp has the value "ImportOverrideValue"-->
</Project>
Załóżmy, że tworzysz importer.proj
i ustawiasz wartość globalną dla następujących TreatedAsLocalProp
wartości:
dotnet msbuild .\importer.proj -p:TreatedAsLocalProp=GlobalOverrideValue
Dane wyjściowe to:
importer.proj(9,9): warning : TreatedAsLocalProp(importer.proj): GlobalOverrideValue
Teraz załóżmy, że kompilujesz za pomocą właściwości TrySecondOverride
:true
dotnet msbuild .\importer.proj -p:TreatedAsLocalProp=GlobalOverrideValue -p:TrySecondOverride=true
Dane wyjściowe to:
importer.proj(13,9): warning : TreatedAsLocalProp(importer.proj): SecondOverrideValue
W przykładzie pokazano, że właściwość jest traktowana jako lokalna po zaimportowaniu projektu, w którym TreatAsLocalProperty
użyto atrybutu, a nie tylko w importowanym pliku. Wartość właściwości ma wpływ na wartość globalnego zastąpienia, ale tylko przed importowanym projektem, w którym TreatAsLocalProperty
jest używany.
Aby uzyskać więcej informacji, zobacz Project element (MSBuild) i Instrukcje: kompilowanie tych samych plików źródłowych przy użyciu różnych opcji.
Funkcje właściwości
Począwszy od środowiska .NET Framework w wersji 4 do obliczania skryptów programu MSBuild można używać funkcji właściwości. Funkcje umożliwiają odczytywanie godziny systemowej, porównywanie ciągów tekstowych, porównywanie wyrażeń regularnych i wykonywanie wielu innych czynności w skrypcie kompilacji bez używania zadań programu MSBuild.
Można używać metod ciągów tekstowych (wystąpień) do wykonywania operacji na dowolnych wartościach właściwości oraz wywoływać metody statyczne wielu klas systemowych. Na przykład za pomocą poniższej składni można ustawić bieżącą datę we właściwość kompilacji:
<Today>$([System.DateTime]::Now.ToString("yyyy.MM.dd"))</Today>
Aby uzyskać więcej informacji i listę funkcji właściwości, zobacz Funkcje właściwości.
Przechowywanie kodu XML we właściwościach
Właściwości mogą zawierać dowolny kod XML pomocny w przekazywaniu wartości do zadań albo wyświetlaniu informacji o logowaniu. W przykładzie poniżej pokazano właściwość ConfigTemplate
, która ma wartość zawierającą kod XML oraz odwołania do innych właściwości. Program MSBuild zastępuje odwołania do właściwości przy użyciu odpowiednich wartości właściwości. Wartości właściwości są przypisywane w kolejności, w jakiej występują. Dlatego w tym przykładzie właściwości użyte w odwołaniach $(MySupportedVersion)
, $(MyRequiredVersion)
i $(MySafeMode)
powinny już być zdefiniowane.
<PropertyGroup>
<ConfigTemplate>
<Configuration>
<Startup>
<SupportedRuntime
ImageVersion="$(MySupportedVersion)"
Version="$(MySupportedVersion)"/>
<RequiredRuntime
ImageVersion="$(MyRequiredVersion)"
Version="$(MyRequiredVersion)"
SafeMode="$(MySafeMode)"/>
</Startup>
</Configuration>
</ConfigTemplate>
</PropertyGroup>
Powiązana zawartość
- Pojęcia dotyczące programu MSBuild
- MSBuild
- Instrukcje: używanie zmiennych środowiskowych w kompilacji
- Instrukcje: odwołanie do nazwy lub lokalizacji pliku projektu
- Instrukcje: kompilowanie tych samych plików źródłowych przy użyciu różnych opcji
- Właściwości zarezerwowane i dobrze znane w programie MSBuild
- Element właściwości (MSBuild)