Partilhar via


Personalização de espaços de nomes

Os nomes dos pacotes Java muitas vezes não correspondem às convenções do espaço de nomes C# devido a problemas como prefixos extra e diferenças de capitalização.

Por exemplo, o nome com.microsoft.streamwriters do pacote Java seria automaticamente traduzido para Com.Microsoft.Streamwriters porque o processo de ligação converte automaticamente os namespaces para caso Pascal. No entanto, uma opção melhor seria Microsoft.StreamWriters.

Isto pode ser conseguido adicionando um <AndroidNamespaceReplacement> item ao ficheiro do projeto:

<ItemGroup>
  <AndroidNamespaceReplacement Include='com.microsoft.streamwriters' Replacement='Microsoft.StreamWriters' />
</ItemGroup>

Embora os pacotes Java também possam ser renomeados usando o tradicional metadata, pode ser aborrecido renomear muitos pacotes semelhantes:

<attr path="/api/package[@name='com.microsoft.accessibility']" name="managedName">Microsoft.Accessibility</attr>
<attr path="/api/package[@name='com.microsoft.content']" name="managedName">Microsoft.Content</attr>
<attr path="/api/package[@name='com.microsoft.core']" name="managedName">Microsoft.Core</attr>
...

Com <AndroidNamespaceReplacement>, a mesma transformação MSBuild colocada no ficheiro do projeto pode ser aplicada a todos os pacotes correspondentes:

<ItemGroup>
  <AndroidNamespaceReplacement Include='com.microsoft' Replacement='Microsoft' />
</ItemGroup>

Especificação

Estas substituições serão executadas para <package> elementos que não especifiquem um metadata@managedName atributo.
Caso @managedName seja utilizado, estará a optar por fornecer o nome exato desejado, e não será processado posteriormente.

Ao contrário dos metadados não utilizados, estas substituições não geram um aviso se não forem utilizadas.

Sensível às maiúsculas e minúsculas

As substituições ocorrem após a transformação automática para maiúsculas e minúsculas em Pascal, mas a comparação é insensível a maiúsculas e minúsculas.

Assim, ambos os seguintes são equivalentes:

<AndroidNamespaceReplacement Include='Androidx' Replacement='AndroidX' />
<AndroidNamespaceReplacement Include='androidx' Replacement='AndroidX' />

Limites de palavras

As substituições ocorrem apenas em palavras completas (partes do espaço de nomes).

Assim,

<AndroidNamespaceReplacement Include='Com' Replacement='' />

Combina com Com.Google.Library, mas não com Common.Google.Library ou Google.Imaging.Dicom.

Podem ser usadas várias palavras completas:

<AndroidNamespaceReplacement Include='Com.Google' Replacement='Google' />
<AndroidNamespaceReplacement Include='Com.Androidx' Replacement='Microsoft.AndroidX' />

Posição da palavra

A correspondência de segmentos da palavra pode ser restringida ao início ou ao fim de um namespace, acrescentando um . ou antepondo um ., respetivamente.

<AndroidNamespaceReplacement Include='Androidx.' Replacement='Microsoft.AndroidX' />

corresponde Androidx.Core, mas não Square.OkHttp.Androidx.

Do mesmo modo,

<AndroidNamespaceReplacement Include='.Compose' Replacement='ComposeUI' />

corresponde a Google.AndroidX.Compose, mas não a Google.Compose.Writer.

Tanto o prepender como o acrescentar a . torna-o uma correspondência exata.

<AndroidNamespaceReplacement Include='.Androidx.' Replacement='Microsoft.AndroidX' />

corresponde Androidx, mas não Google.Androidx.Core.

Ordem de substituição

As substituições são executadas na ordem especificada pelo <ItemGroup>, no entanto, adicionar a este grupo em momentos diferentes pode resultar numa ordem não intencional.

As substituições são executadas sequencialmente, e múltiplas substituições podem afetar um único namespace.

<AndroidNamespaceReplacement Include='Androidx' Replacement='Microsoft.AndroidX' />
<AndroidNamespaceReplacement Include='View' Replacement='Views' />

muda Androidx.View para Microsoft.AndroidX.Views.

Relação com metadados

Tecnicamente @(AndroidNamespaceReplacement) é implementado como um caso especial de <metadata>, e pode ser colocado diretamente num metadata.xml ficheiro em
formulário de metadados, se desejado.

Ou seja, o item do MSBuild:

<ItemGroup>
  <AndroidNamespaceReplacement Include='com.microsoft' Replacement='Microsoft' />
</ItemGroup>

poderia antes ser colocado em metadata.xml como:

<metadata>
  <ns-replace source='com.microsoft' replacement='Microsoft' />
</metadata>