Compartilhar via


Funções de propriedade

As funções de propriedade são chamadas para métodos do .NET que aparecem nas definições de propriedade do MSBuild. Normalmente, você as usa para construir definições de propriedade que exigem uma lógica mais complexa.

Ao contrário das tarefas, as funções de propriedade podem ser utilizadas fora dos alvos. As funções de propriedade são avaliadas sempre que as propriedades ou itens são expandidos. Portanto, para propriedades e itens fora de qualquer destino, as funções de propriedade são avaliadas antes de qualquer execução de destino. Para grupos de propriedades e grupos de itens dentro de alvos, as funções de propriedades são avaliadas quando o alvo é executado.

Sem usar tarefas do MSBuild, você pode ler o tempo do sistema, comparar cadeias de caracteres, corresponder a expressões regulares e executar outras ações no script de build. MSBuild tenta converter string em número e número em string e realizar outras conversões conforme necessário.

Valores de cadeia de caracteres retornados de funções de propriedade tem caracteres especiais de escape. Se você quiser que o valor seja tratado como se fosse colocado diretamente no arquivo do projeto, use $([MSBuild]::Unescape()) para desfazer o escape dos caracteres especiais.

Sintaxe da função de propriedade

Há três tipos de funções de propriedade; cada tipo tem uma sintaxe diferente:

  • Funções de propriedade de cadeia de caracteres (instância)
  • Funções de propriedade estática
  • Funções de propriedade MSBuild

Funções de propriedade de cadeia de caracteres

Todos os valores de propriedade de build são apenas valores de cadeia de caracteres. Você pode usar métodos de cadeia (instância) para operar em qualquer valor de propriedade. Por exemplo, você pode extrair o nome da unidade de disco (os três primeiros caracteres) de uma propriedade de build que representa um caminho completo, utilizando este código:

$(ProjectOutputFolder.Substring(0,3))

Funções de propriedade estática

No script de build, você pode acessar as propriedades estáticas e os métodos de muitas classes do sistema. Para obter o valor de uma propriedade estática, use a sintaxe a seguir, onde Class está o nome da classe do sistema e Property é o nome da propriedade.

$([Class]::Property)

Por exemplo, você pode usar o código a seguir para definir uma propriedade de build para a data e hora atuais.

<Today>$([System.DateTime]::Now)</Today>

Para chamar um método estático, use a seguinte sintaxe, onde Class está o nome da classe do sistema, Method é o nome do método e (Parameters) é a lista de parâmetros para o método:

$([Class]::Method(Parameters))

Por exemplo, para definir uma propriedade de build para um novo GUID, você pode usar este script:

<NewGuid>$([System.Guid]::NewGuid())</NewGuid>

Para métodos sobrecarregados, o MSBuild tenta encontrar um método com parâmetros correspondentes.

No MSBuild 17.14 e posterior, você pode usar a sintaxe out _ de parâmetro para especificar um out parâmetro. Consulte parâmetros de referência. O valor do out parâmetro é ignorado. Por exemplo:

<IsInteger>$([System.Int32]::TryParse("123", out _))</IsInteger>

A propriedade IsInteger será true se a entrada for analisada com êxito como um inteiro, mas o valor analisado for ignorado.

Em funções de propriedade estática, você pode usar qualquer método estático público ou propriedade definida no .NET Standard 2.0 para estas classes do sistema:

Observação

Métodos e propriedades que não estão definidos no .NET Standard 2.0 podem estar disponíveis quando você usa o MSBuild em um ambiente que dá suporte a eles, mas não pode ter a garantia de estar disponível em todas as situações. Por motivos de compatibilidade, eles são melhor evitados.

Além disso, você pode usar os seguintes métodos estáticos e propriedades:

Funções da propriedade System.OperatingSystem

As System.OperatingSystem funções de propriedade retornam informações sobre o sistema operacional no qual o MSBuild está em execução. Por exemplo, se o projeto for direcionado ao Linux e você compilá-lo no macOS, as funções de propriedade retornarão informações sobre o macOS.

No MSBuild em execução no .NET (dotnet build), todos os métodos estáticos da System.OperatingSystem classe podem ser chamados como funções de propriedade estática.

No MSBuild em execução no .NET Framework (MSBuild.exe), somente os seguintes métodos de System.OperatingSystem podem ser invocados como funções de propriedade estática. O MSBuild os implementa internamente, pois System.OperatingSystem não os define no .NET Framework. Métodos para sistemas operacionais para os quais não há nenhum SDK do .NET, como System.OperatingSystem::IsTvOS, não podem ser chamados.

O exemplo a seguir mostra o uso dessas funções de propriedade.

<IsWindows>$([System.OperatingSystem]::IsWindows())</IsWindows>

Chamar métodos de instância em propriedades estáticas

Se você acessar uma propriedade estática que retorna uma instância de objeto, poderá invocar os métodos de instância desse objeto. Para invocar um método de instância, use a seguinte sintaxe, onde Class está o nome da classe do sistema, Property é o nome da propriedade, Method é o nome do método e (Parameters) é a lista de parâmetros para o método:

$([Class]::Property.Method(Parameters))

O nome da classe deve ser totalmente qualificado com o namespace.

Por exemplo, você pode usar o código a seguir para definir uma propriedade de build para a data atual hoje.

<Today>$([System.DateTime]::Now.ToString('yyyy.MM.dd'))</Today>

Funções de propriedade MSBuild

Vários métodos estáticos em seu build podem ser acessados para fornecer suporte a operações aritméticas, operações lógicas bit a bit e caracteres de escape. Você acessa esses métodos usando a sintaxe a seguir, onde Method está o nome do método e (Parameters) é a lista de parâmetros para o método.

$([MSBuild]::Method(Parameters))

Por exemplo, para adicionar duas propriedades que têm valores numéricos, use o código a seguir.

$([MSBuild]::Add($(NumberOne), $(NumberTwo)))

Aqui está uma lista de funções de propriedade do MSBuild:

Assinatura de função Descrição
double Add(double a, double b) Adicionar dois duplos.
long Add(long a, long b) Adicionar dois longos.
int BitwiseOr(int first, int second) Realizar um bit a bit OR no primeiro e segundo (primeiro | segundo).
int BitwiseAnd(int first, int second) Realizar um bit a bit AND no primeiro e segundo (primeiro e segundo).
int BitwiseXor(int first, int second) Realizar um bit a bit XOR no primeiro e segundo (primeiro ^ segundo).
int BitwiseNot(int first) Realizar um bit a bit NOT (~primeiro).
string CheckFeatureAvailability(string featureName) Retorna o nome do recurso como uma cadeia de caracteres se e somente se o recurso especificado tiver suporte nesta versão do MSBuild.
string ConvertToBase64(string toEncode) Retorna a cadeia de caracteres depois de converter todos os bytes em base 64 (caracteres alfanuméricos mais + e /), terminando em um ou dois =.
string ConvertFromBase64(string toDecode) Retorna a cadeia de caracteres depois de converter de base 64 (caracteres alfanuméricos mais + e /), terminando em um ou dois =.
double Divide(double a, double b) Dividir dois duplos.
long Divide(long a, long b) Dividir dois longos.
bool DoesTaskHostExist(string runtime, string architecture) Retorna se um host de tarefa está atualmente instalado para os valores de runtime e arquitetura especificados. Consulte MSBuild DoesTaskHostExist.
string Escape(string unescaped) Escapar a cadeia de caracteres de acordo com a regras de escape do MSBuild.
string EnsureTrailingSlash(string path) Se o caminho especificado não tiver uma barra à direita, adicione uma. Se o caminho for uma cadeia de caracteres vazia, não a modificará. Consulte MSBuild EnsureTrailingSlash.
string FilterTargetFrameworks(string incoming, string filter) Retorne a lista das estruturas de destino que correspondem ao filtro especificado. Uma estrutura de destino de incoming será mantida se corresponder a quaisquer das estruturas de destino desejadas em filter. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string GetCurrentToolsDirectory() Obtenha o diretório de ferramentas do MSBuild atual.
string GetMSBuildExtensionsPath() Obtém o caminho para o diretório de extensões do MSBuild. Ao executar MSBuild.exe, essa geralmente é a pasta executável do MSBuild. Ao executar no Visual Studio, essa é a subpasta do MSBuild na pasta de instalação do Visual Studio.
string GetMSBuildSDKsPath() Obtém o diretório em que os SDKs são esperados para a instância atual do MSBuild.
string GetProgramFiles32() Obtém a pasta raiz do sistema de arquivos em que os pacotes de software de 32 bits normalmente são instalados. Por exemplo, C:\Program Files (x86).
string GetTargetFrameworkIdentifier(string targetFramework) Analisar o TargetFrameworkIdentifier do TargetFramework. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string GetTargetFrameworkVersion(string targetFramework, int versionPartCount) Analisar o TargetFrameworkVersion do TargetFramework. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string GetTargetPlatformIdentifier(string targetFramework) Analisar o TargetPlatformIdentifier do TargetFramework. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string GetTargetPlatformVersion(string targetFramework, int versionPartCount) Analisar o TargetPlatformVersion do TargetFramework. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string GetToolsDirectory32() Obtém o diretório em que as versões de 32 bits das ferramentas do MSBuild estão localizadas.
string GetToolsDirectory64() Obtém o diretório em que as versões de 64 bits das ferramentas do MSBuild estão localizadas.
string GetDirectoryNameOfFileAbove(string startingDirectory, string fileName) Localize e retorne o diretório de um arquivo no diretório especificado ou em um local na estrutura de diretório acima desse diretório. Consulte MSBuild GetDirectoryNameOfFileAbove.
string GetPathOfFileAbove(string file, string startingDirectory) Pesquisa e retorna o caminho completo para um arquivo na estrutura de diretórios em e acima do local do arquivo de build atual ou com base no startingDirectory, se especificado. Consulte MSBuild GetPathOfFileAbove.
object GetRegistryValue(string keyName, string valueName, object defaultValue) Obtenha o valor da chave do Registro e o valor. Consulte MSBuild GetRegistryValue.
object GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views) Obtém dados do Registro do sistema, dada a chave do Registro, o valor e uma ou mais exibições ordenadas do Registro. Consulte MSBuild GetRegistryValueFromView.
string GetVsInstallRoot() Obtém o caminho completo para a raiz da pasta de instalação do Visual Studio associada à instância atual do MSBuild.
bool IsOsPlatform(string platformString) Especifique se a plataforma atual do sistema operacional é platformString. platformString deve ser um membro de OSPlatform.
bool IsOsBsdLike() True se o sistema operacional atual for um sistema Unix no estilo BSD.
bool IsOSUnixLike() True se o sistema operacional atual for um sistema Unix.
bool IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) Retorne 'True' se a estrutura de destino candidata (segundo argumento) for compatível com a estrutura de destino indicada pelo primeiro argumento e 'False' do contrário. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
int LeftShift(int operand, int count) Desloque para a esquerda em count bits. MSBuild 17.7 e posterior.
string MakeRelative(string basePath, string path) Faz path em relação a basePath. basePath deve ser um diretório absoluto. Se path não puder ser tornado relativo, ele será retornado de forma textual. Similar a Uri.MakeRelativeUri. Consulte MSBuild MakeRelative.
double Modulo(double a, double b) Modular dois duplos.
long Modulo(long a, long b) Modular dois longos.
double Multiply(double a, double b) Multiplicar dois duplos.
long Multiply(long a, long b) Multiplicar dois longos.
string NormalizeDirectory(params string[] path) Obtém o caminho completo canonizado do diretório fornecido e garante que ele contém os caracteres do separador de diretório corretos para o sistema operacional atual, enquanto garante que tem uma barra à direita.
string NormalizePath(params string[] path) Obtém o caminho completo canônico do caminho fornecido e garante que ele contenha os caracteres do separador de diretório corretos para o sistema operacional atual.
int RightShift(int operand, int count) Desloque para a direita em count bits, como um inteiro com sinal. MSBuild 17.7 e posterior.
int RightShiftUnsigned(int operand, int count) Desloque para a direita em count bits, tratando o operando como um inteiro sem sinal. MSBuild 17.7 e posterior.
object StableStringHash(string toHash, StringHashingAlgorithm algo) Aceita um argumento de cadeia de caracteres e retorna um código hash que é garantido como estável. Consulte MSBuild StableStringHash.
string SubstringByAsciiChars(string input, int start, int length) Retorna uma subcadeia de caracteres de input, começando na posição especificada start e com a especificada length, tratando a cadeia de caracteres como codificada em ASCII.
double Subtract(double a, double b) Subtrair dois duplos.
long Subtract(long a, long b) Subtrair dois longos.
string Unescape(string escaped) Deixar sem escape a cadeia de caracteres de acordo com a regras de escape do MSBuild.
string ValueOrDefault(string conditionValue, string defaultValue) Retorna a cadeia de caracteres no parâmetro defaultValue somente se o parâmetro conditionValue estiver vazio, caso contrário, retorne o valor conditionValue. Consulte MSBuild ValueOrDefault.
bool VersionEquals(string a, string b) Retorne true se as versões a e b forem equivalentes de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionGreaterThan(string a, string b) Retorne true se a versão a for maior do que b de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionGreaterThanOrEquals(string a, string b) Retorne true se a versão a for maior ou igual a b de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionLessThan(string a, string b) Retorne true se a versão a for menor do que b de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionLessThanOrEquals(string a, string b) Retorne true se a versão a for menor ou igual a b de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionNotEquals(string a, string b) Retorne false se as versões a e b forem equivalentes de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
Assinatura de função Descrição
double Add(double a, double b) Adicionar dois duplos.
long Add(long a, long b) Adicionar dois longos.
int BitwiseOr(int first, int second) Realizar um bit a bit OR no primeiro e segundo (primeiro | segundo).
int BitwiseAnd(int first, int second) Realizar um bit a bit AND no primeiro e segundo (primeiro e segundo).
int BitwiseXor(int first, int second) Realizar um bit a bit XOR no primeiro e segundo (primeiro ^ segundo).
int BitwiseNot(int first) Realizar um bit a bit NOT (~primeiro).
string CheckFeatureAvailability(string featureName) Retorna o nome do recurso como uma cadeia de caracteres se e somente se o recurso especificado tiver suporte nesta versão do MSBuild.
string ConvertToBase64(string toEncode) Retorna a cadeia de caracteres depois de converter todos os bytes em base 64 (caracteres alfanuméricos mais + e /), terminando em um ou dois =.
string ConvertFromBase64(string toDecode) Retorna a cadeia de caracteres depois de converter de base 64 (caracteres alfanuméricos mais + e /), terminando em um ou dois =.
double Divide(double a, double b) Dividir dois duplos.
long Divide(long a, long b) Dividir dois longos.
bool DoesTaskHostExist(string runtime, string architecture) Retorna se um host de tarefa está atualmente instalado para os valores de runtime e arquitetura especificados. Consulte MSBuild DoesTaskHostExist.
string Escape(string unescaped) Escapar a cadeia de caracteres de acordo com a regras de escape do MSBuild.
string EnsureTrailingSlash(string path) Se o caminho especificado não tiver uma barra à direita, adicione uma. Se o caminho for uma cadeia de caracteres vazia, não a modificará. Consulte MSBuild EnsureTrailingSlash.
string GetCurrentToolsDirectory() Obtenha o diretório de ferramentas do MSBuild atual.
string GetMSBuildExtensionsPath() Obtém o caminho para o diretório de extensões do MSBuild. Ao executar MSBuild.exe, essa geralmente é a pasta executável do MSBuild. Ao executar no Visual Studio, essa é a subpasta do MSBuild na pasta de instalação do Visual Studio.
string GetMSBuildSDKsPath() Obtém o diretório em que os SDKs são esperados para a instância atual do MSBuild.
string GetProgramFiles32() Obtém a pasta raiz do sistema de arquivos em que os pacotes de software de 32 bits normalmente são instalados. Por exemplo, C:\Program Files (x86).
string GetTargetFrameworkIdentifier(string targetFramework) Analisar o TargetFrameworkIdentifier do TargetFramework. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string GetTargetFrameworkVersion(string targetFramework, int versionPartCount) Analisar o TargetFrameworkVersion do TargetFramework. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string GetTargetPlatformIdentifier(string targetFramework) Analisar o TargetPlatformIdentifier do TargetFramework. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string GetTargetPlatformVersion(string targetFramework, int versionPartCount) Analisar o TargetPlatformVersion do TargetFramework. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string GetToolsDirectory32() Obtém o diretório em que as versões de 32 bits das ferramentas do MSBuild estão localizadas.
string GetToolsDirectory64() Obtém o diretório em que as versões de 64 bits das ferramentas do MSBuild estão localizadas.
string GetDirectoryNameOfFileAbove(string startingDirectory, string fileName) Localize e retorne o diretório de um arquivo no diretório especificado ou em um local na estrutura de diretório acima desse diretório. Consulte MSBuild GetDirectoryNameOfFileAbove.
string GetPathOfFileAbove(string file, string startingDirectory) Pesquisa e retorna o caminho completo para um arquivo na estrutura de diretórios em e acima do local do arquivo de build atual ou com base no startingDirectory, se especificado. Consulte MSBuild GetPathOfFileAbove.
object GetRegistryValue(string keyName, string valueName, object defaultValue) Obtenha o valor da chave do Registro e o valor. Consulte MSBuild GetRegistryValue.
object GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views) Obtém dados do Registro do sistema, dada a chave do Registro, o valor e uma ou mais exibições ordenadas do Registro. Consulte MSBuild GetRegistryValueFromView.
string GetVsInstallRoot() Obtém o caminho completo para a raiz da pasta de instalação do Visual Studio associada à instância atual do MSBuild.
bool IsOsPlatform(string platformString) Especifique se a plataforma atual do sistema operacional é platformString. platformString deve ser um membro de OSPlatform.
bool IsOsBsdLike() True se o sistema operacional atual for um sistema Unix no estilo BSD.
bool IsOSUnixLike() True se o sistema operacional atual for um sistema Unix.
bool IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) Retorne 'True' se a estrutura de destino candidata (segundo argumento) for compatível com a estrutura de destino indicada pelo primeiro argumento e 'False' do contrário. Consulte as funções TargetFramework e TargetPlatform do MSBuild.
string MakeRelative(string basePath, string path) Faz path em relação a basePath. basePath deve ser um diretório absoluto. Se não for possível tornar path relativo, ele será retornado literalmente. Similar a Uri.MakeRelativeUri. Consulte MSBuild MakeRelative.
double Modulo(double a, double b) Modular dois duplos.
long Modulo(long a, long b) Modular dois longos.
double Multiply(double a, double b) Multiplicar dois duplos.
long Multiply(long a, long b) Multiplicar dois longos.
string NormalizeDirectory(params string[] path) Obtém o caminho completo canonizado do diretório fornecido e garante que ele contém os caracteres do separador de diretório corretos para o sistema operacional atual, enquanto garante que tem uma barra à direita.
string NormalizePath(params string[] path) Obtém o caminho completo canônico do caminho fornecido e garante que ele contenha os caracteres do separador de diretório corretos para o sistema operacional atual.
object StableStringHash(string toHash, StringHashingAlgorithm algo) Aceita um argumento de cadeia de caracteres e retorna um código hash que é garantido como estável. Consulte MSBuild StableStringHash.
string SubstringByAsciiChars(string input, int start, int length) Retorna uma subcadeia de caracteres de input, começando na posição especificada start e com a especificada length, tratando a cadeia de caracteres como codificada em ASCII.
double Subtract(double a, double b) Subtrair dois duplos.
long Subtract(long a, long b) Subtrair dois longos.
string Unescape(string escaped) Deixar sem escape a cadeia de caracteres de acordo com a regras de escape do MSBuild.
string ValueOrDefault(string conditionValue, string defaultValue) Retorna a cadeia de caracteres no parâmetro defaultValue somente se o parâmetro conditionValue estiver vazio, caso contrário, retorne o valor conditionValue. Consulte MSBuild ValueOrDefault.
bool VersionEquals(string a, string b) Retorne true se as versões a e b forem equivalentes de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionGreaterThan(string a, string b) Retorne true se a versão a for maior do que b de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionGreaterThanOrEquals(string a, string b) Retorne true se a versão a for maior ou igual a b de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionLessThan(string a, string b) Retorne true se a versão a for menor do que b de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionLessThanOrEquals(string a, string b) Retorne true se a versão a for menor ou igual a b de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.
bool VersionNotEquals(string a, string b) Retorne false se as versões a e b forem equivalentes de acordo com as regras abaixo. Consulte as funções de comparação de versão do MSBuild.

Funções de propriedade aninhadas

Você pode combinar funções de propriedade para formar funções mais complexas, como mostra o exemplo a seguir:

$([MSBuild]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))

Este exemplo retorna o valor do FileAttributes. Bit Archive (32 ou 0) do arquivo fornecido pelo caminho tempFile. Observe que os valores de dados enumerados não podem aparecer por nome em alguns contextos. No exemplo anterior, o valor numérico (32) deve ser usado. Em outros casos, dependendo das expectativas do método chamado, o valor dos dados de enumeração deve ser usado. No exemplo a seguir, o valor de enumeração RegexOptions. ECMAScript deve ser usado porque um valor numérico não pode ser convertido como este método espera.

<PropertyGroup>
    <GitVersionHeightWithOffset>$([System.Text.RegularExpressions.Regex]::Replace("$(PrereleaseVersion)", "^.*?(\d+)$", "$1", "System.Text.RegularExpressions.RegexOptions.ECMAScript"))</GitVersionHeightWithOffset>
</PropertyGroup>

Metadados também podem aparecer em funções de propriedade aninhadas. Para obter mais informações, consulte Envio em lote.

MSBuild DoesTaskHostExist

A função de propriedade DoesTaskHostExist no MSBuild retorna se um host de tarefa está atualmente instalado para os valores especificados de tempo de execução e arquitetura.

Essa função de propriedade tem a seguinte sintaxe:

$([MSBuild]::DoesTaskHostExist(string theRuntime, string theArchitecture))

EnsureTrailingSlash do MSBuild

A função de propriedade EnsureTrailingSlash no MSBuild adicionará uma barra à direita se não houver.

Essa função de propriedade tem a seguinte sintaxe:

$([MSBuild]::EnsureTrailingSlash('$(PathProperty)'))

MSBuild GetDirectoryNameOfFileAbove

A função de propriedade MSBuild GetDirectoryNameOfFileAbove pesquisa em direção ascendente por um diretório que contém o arquivo especificado, começando no diretório especificado e incluindo-o. Ele retorna o caminho completo do diretório mais próximo que contém o arquivo se ele for encontrado, caso contrário, uma cadeia de caracteres vazia.

Essa função de propriedade tem a seguinte sintaxe:

$([MSBuild]::GetDirectoryNameOfFileAbove(string startingDirectory, string fileName))

Este exemplo mostra como importar o arquivo EnlistmentInfo.props mais próximo dentro ou acima da pasta atual, somente se uma correspondência for encontrada:

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))\EnlistmentInfo.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))' != '' " />

Este exemplo pode ser escrito de forma mais concisa usando a GetPathOfFileAbove função em vez disso:

<Import Project="$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))' != '' " />

GetPathOfFileAbove do MSBuild

A função de propriedade MSBuild GetPathOfFileAbove pesquisa em direção ascendente por um diretório que contém o arquivo especificado, começando no diretório especificado e incluindo-o. Ele retorna o caminho completo do arquivo correspondente mais próximo se for encontrado, caso contrário, uma cadeia de caracteres vazia.

Essa função de propriedade tem a seguinte sintaxe:

$([MSBuild]::GetPathOfFileAbove(string file, [string startingDirectory]))

onde file está o nome do arquivo a ser pesquisado e startingDirectory é um diretório opcional para iniciar a pesquisa. Por padrão, a pesquisa é iniciada no próprio diretório do arquivo atual.

Este exemplo mostra como importar um arquivo chamado dir.props dentro ou acima do diretório atual, somente se uma correspondência for encontrada:

<Import Project="$([MSBuild]::GetPathOfFileAbove(dir.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(dir.props))' != '' " />

que é funcionalmente equivalente a

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))' != '' " />

No entanto, às vezes, você precisa iniciar a pesquisa no diretório pai para evitar a correspondência com o arquivo atual. Este exemplo mostra como um arquivo Directory.Build.props pode importar o arquivo Directory.Build.props mais próximo em um nível estritamente mais alto da árvore, sem importar-se recursivamente:

<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />

que é funcionalmente equivalente a

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildThisFileDirectory)../', 'Directory.Build.props'))/Directory.Build.props" />

MSBuild GetRegistryValue

A função de propriedade MSBuild GetRegistryValue retorna o valor de uma chave do Registro. Essa função usa dois argumentos, o nome da chave e o nome do valor e retorna o valor do registro. Se você não especificar um nome de valor, o valor padrão será retornado.

Os exemplos a seguir mostram como essa função é usada:

$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, ``))                                  // default value
$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, `SymbolCacheDir`))
$([MSBuild]::GetRegistryValue(`HKEY_LOCAL_MACHINE\SOFTWARE\(SampleName)`, `(SampleValue)`))             // parens in name and value

Aviso

Na versão do SDK do .NET do MSBuild (dotnet build), essa função não tem suporte.

MSBuild GetRegistryValueFromView

A função de propriedade GetRegistryValueFromView do MSBuild obtém os dados de registro do sistema, dados a chave do registro, o valor e uma ou mais exibições de registro solicitada. A chave e o valor são pesquisados em cada exibição do registro em ordem até serem encontrados.

A sintaxe dessa função de propriedade é:

[MSBuild]::GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views)

O sistema operacional Windows de 64 bits mantém uma chave do RegistroHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node que apresenta uma visão de RegistroHKEY_LOCAL_MACHINE\SOFTWARE para aplicativos de 32 bits.

Por padrão, um aplicativo de 32 bits em execução no WOW64 acessa a visualização do registro de 32 bits e um aplicativo de 64 bits acessa a visualização do registro de 64 bits.

As seguintes exibições de registro estão disponíveis:

Exibição do Registro Definição
RegistryView.Registry32 A exibição do registro do aplicativo de 32 bits.
RegistryView.Registry64 A exibição do registro do aplicativo de 64 bits.
RegistryView.Default A visualização do registro que corresponde ao processo no qual o aplicativo está sendo executado.

A seguir, é mostrado um exemplo.

$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Silverlight\v3.0\ReferenceAssemblies', 'SLRuntimeInstallPath', null, RegistryView.Registry64, RegistryView.Registry32))

O código anterior obtém os dados de SLRuntimeInstallPath da chave ReferenceAssemblies, procurando primeiro na exibição do Registro de 64 bits e depois na exibição do Registro de 32 bits.

Aviso

Na versão do SDK do .NET do MSBuild (dotnet build), essa função não tem suporte.

MSBuild MakeRelative

A função de propriedade MakeRelative do MSBuild retorna o caminho relativo do segundo caminho relativo ao primeiro caminho. Cada caminho pode ser um arquivo ou pasta.

Essa função de propriedade tem a seguinte sintaxe:

$([MSBuild]::MakeRelative($(FileOrFolderPath1), $(FileOrFolderPath2)))

O código a seguir é um exemplo dessa sintaxe.

<PropertyGroup>
    <Path1>c:\users\</Path1>
    <Path2>c:\users\username\</Path2>
</PropertyGroup>

<Target Name = "Go">
    <Message Text ="$([MSBuild]::MakeRelative($(Path1), $(Path2)))" />
    <Message Text ="$([MSBuild]::MakeRelative($(Path2), $(Path1)))" />
</Target>

<!--
Output:
   username\
   ..\
-->

MSBuild StableStringHash

A função de propriedade MSBuild StableStringHash aceita um argumento de cadeia de caracteres e retorna um código hash que é garantido como estável, o que significa que o mesmo código sempre é retornado para a mesma entrada de cadeia de caracteres. O hash retornado é o mesmo, independentemente de o MSBuild ou dotnet build ser usado e ser estável em toda a arquitetura de plataforma, diferentemente do método GetHashCode.NET. Não é garantido que ele esteja estável em diferentes versões do MSBuild.

Essa função está disponível no MSBuild 16.9.0 ou posterior.

O exemplo a seguir mostra como essa função é usada.

<Project>
   <PropertyGroup>
      <MyHash>$([MSBuild]::StableStringHash("test1"))</MyHash>
   </PropertyGroup>

   <Target Name="WriteHash" AfterTargets="Build">
      <Message Text="Hash: $(MyHash)"/>
   </Target>
</Project>

Com o MSBuild versão 17.10 e posterior, essa função aceita o segundo argumento opcional solicitando que o algoritmo de hash seja usado:

<Project>
   <PropertyGroup>
      <MyHash>$([MSBuild]::StableStringHash("test1", "Sha256"))</MyHash>
   </PropertyGroup>

   <Target Name="WriteHash" AfterTargets="Build">
      <Message Text="Hash: $(MyHash)"/>
   </Target>
</Project>

O segundo argumento não diferencia maiúsculas de minúsculas e atualmente dá suporte aos seguintes valores:

  • Herdado - Mantém o mesmo comportamento de chamar a função sem o segundo argumento. Retorna um inteiro de 32 bits assinado com propriedades semelhantes à string.GetHashCode.
  • Fnv1a32bit – Retorna um número inteiro assinado de 32 bits que representa um hash Fowler–Noll-Vo da versão '1a' da string fornecida.
  • Fnv1a64bit - Retorna um inteiro de 64 bits assinado que representa um hash Fowler-Noll-Vo da versão '1a' do hash da string fornecida.
  • Sha256 – Retorna uma cadeia de caracteres hexáxe não prefixada que representa um hash SHA256 da cadeia de caracteres fornecida.

MSBuild ValueOrDefault

A função de propriedade MSBuild ValueOrDefault retorna o primeiro argumento, a menos que seja nulo ou vazio. Se o primeiro argumento for nulo ou vazio, a função retornará o segundo argumento.

O exemplo a seguir mostra como essa função é usada.

<Project>

    <PropertyGroup>
        <Value1>$([MSBuild]::ValueOrDefault('$(UndefinedValue)', 'a'))</Value1>
        <Value2>$([MSBuild]::ValueOrDefault('b', '$(Value1)'))</Value2>
    </PropertyGroup>

    <Target Name="MyTarget">
        <Message Text="Value1 = $(Value1)" />
        <Message Text="Value2 = $(Value2)" />
    </Target>
</Project>

<!--
Output:
  Value1 = a
  Value2 = b
-->

Funções TargetFramework e TargetPlatform do MSBuild

O MSBuild 16.7 e superior definem várias funções para lidar com as propriedades TargetFramework e TargetPlatform.

Assinatura de função Descrição
FilterTargetFrameworks(string incoming, string filter) Retorne a lista das estruturas de destino que correspondem ao filtro especificado. Uma estrutura de destino de incoming será mantida se corresponder a quaisquer das estruturas de destino desejadas em filter.
GetTargetFrameworkIdentifier(string targetFramework) Analisar o TargetFrameworkIdentifier do TargetFramework.
GetTargetFrameworkVersion(string targetFramework, int versionPartCount) Analisar o TargetFrameworkVersion do TargetFramework.
GetTargetPlatformIdentifier(string targetFramework) Analisar o TargetPlatformIdentifier do TargetFramework.
GetTargetPlatformVersion(string targetFramework, int versionPartCount) Analisar o TargetPlatformVersion do TargetFramework.
IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) Retornará verdadeiro se a estrutura de destino candidata (segundo argumento) for compatível com a estrutura de destino indicada pelo primeiro argumento e falso, caso contrário.
Assinatura de função Descrição
GetTargetFrameworkIdentifier(string targetFramework) Analisar o TargetFrameworkIdentifier do TargetFramework.
GetTargetFrameworkVersion(string targetFramework, int versionPartCount) Analisar o TargetFrameworkVersion do TargetFramework.
GetTargetPlatformIdentifier(string targetFramework) Analisar o TargetPlatformIdentifier do TargetFramework.
GetTargetPlatformVersion(string targetFramework, int versionPartCount) Analisar o TargetPlatformVersion do TargetFramework.
IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) Retornará verdadeiro se a estrutura de destino candidata (segundo argumento) for compatível com a estrutura de destino indicada pelo primeiro argumento e falso, caso contrário.

O versionPartCount parâmetro de GetTargetFrameworkVersion e GetTargetPlatformVersion tem um valor padrão de 2.

O exemplo a seguir mostra como essas funções são usadas.

<Project>

    <PropertyGroup>
        <Value1>$([MSBuild]::GetTargetFrameworkIdentifier('net5.0-windows7.0'))</Value1>
        <Value2>$([MSBuild]::GetTargetFrameworkVersion('net5.0-windows7.0'))</Value2>
        <Value3>$([MSBuild]::GetTargetPlatformIdentifier('net5.0-windows7.0'))</Value3>
        <Value4>$([MSBuild]::GetTargetPlatformVersion('net5.0-windows7.0'))</Value4>
        <Value5>$([MSBuild]::IsTargetFrameworkCompatible('net5.0-windows', 'net5.0'))</Value5>
        <Value6>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net6.0'))</Value6>
        <Value7>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net8.0'))</Value7>
        <Value8>$([MSBuild]::IsTargetFrameworkCompatible('net8.0', 'net6.0'))</Value8>
    </PropertyGroup>

    <Target Name="MyTarget">
        <Message Text="Value1 = $(Value1)" />
        <Message Text="Value2 = $(Value2)" />
        <Message Text="Value3 = $(Value3)" />
        <Message Text="Value4 = $(Value4)" />
        <Message Text="Value5 = $(Value5)" />
        <Message Text="Value6 = $(Value6)" />
        <Message Text="Value7 = $(Value7)" />
        <Message Text="Value8 = $(Value8)" />
    </Target>
</Project>
Value1 = .NETCoreApp
Value2 = 5.0
Value3 = windows
Value4 = 7.0
Value5 = True
Value6 = False
Value7 = False
Value8 = True

MSBuild FilterTargetFrameworks

Com o MSBuild 17.6 e posterior (ou .NET 7 e posterior), você pode usar essa função de propriedade para selecionar um subconjunto de uma lista de TFMs (Monikers do Target Framework) para restringir a lista às estruturas que correspondem à lista de TFMs dado o argumento de filtro.

Por exemplo, se incoming for net6.0;net7.0;netstandard2.0 e filter for net7.0;netstandard2.0, o resultado será net7.0;netstandard2.0.

Funções de comparação de versão do MSBuild

O MSBuild 16.5 e superior definem várias funções para comparar cadeias de caracteres que representam versões.

Observação

Operadores de comparação em condições podem comparar cadeias de caracteres que podem ser analisadas como System.Version objetos, mas a comparação pode produzir resultados inesperados. Prefira as funções de propriedade.

Assinatura de função Descrição
VersionEquals(string a, string b) Retorne true se as versões a e b forem equivalentes de acordo com as regras abaixo.
VersionGreaterThan(string a, string b) Retorne true se a versão a for maior do que b de acordo com as regras abaixo.
VersionGreaterThanOrEquals(string a, string b) Retorne true se a versão a for maior ou igual a b de acordo com as regras abaixo.
VersionLessThan(string a, string b) Retorne true se a versão a for menor do que b de acordo com as regras abaixo.
VersionLessThanOrEquals(string a, string b) Retorne true se a versão a for menor ou igual a b de acordo com as regras abaixo.
VersionNotEquals(string a, string b) Retorne false se as versões a e b forem equivalentes de acordo com as regras abaixo.

Nesses métodos, as versões são analisadas como System.Version, com as seguintes exceções:

  • Os caracteres iniciais v ou V são ignorados, o que permite a comparação com $(TargetFrameworkVersion).

  • Tudo, desde o primeiro '-' ou '+' até o final da cadeia de caracteres de versão é ignorado. Isso permite passar versões semânticas (semver), embora a ordem não seja a mesma que a semver. Em vez disso, especificadores de pré-lançamento e metadados de build não têm nenhum peso de classificação. Isso pode ser útil, por exemplo, para ativar um recurso >= x.y e fazê-lo entrar em funcionamento em x.y.z-pre.

  • Partes não especificadas são iguais a partes de valor zero. (x == x.0 == x.0.0 == x.0.0.0).

  • O espaço em branco não é permitido em componentes inteiros.

  • A versão principal só é válida (3 é igual a 3.0.0.0)

  • + não é permitido como sinal positivo nos componentes inteiros (é tratado como metadados de semver e ignorado)

Dica

Comparações de propriedades TargetFramework geralmente devem usar IsTargetFrameworkCompatible em vez de extrair e comparar versões. Isso permite comparar TargetFrameworks que variam em TargetFrameworkIdentifier tanto quanto na versão.

Funções de condição do MSBuild

As funções Exists e HasTrailingSlash não são funções de propriedade. Eles estão disponíveis para uso com o Condition atributo. Confira Condições do MSBuild.