Personnalisation des espaces de noms

Les noms de package Java ne correspondent souvent pas aux conventions d’espace de noms C# en raison de problèmes tels que des préfixes supplémentaires et des différences de mise en majuscules.

Par exemple, le nom du package Java com.microsoft.streamwriters serait automatiquement traduit en Com.Microsoft.Streamwriters car le processus de liaison traduit automatiquement les espaces de noms en casse Pascal. Cependant, un meilleur ajustement serait Microsoft.StreamWriters.

Pour ce faire, ajoutez un <AndroidNamespaceReplacement> élément au fichier projet :

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

Bien que les packages Java puissent également être renommés à l’aide de packages traditionnels metadata, il peut être fastidieux de renommer de nombreux packages similaires :

<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>
...

Avec <AndroidNamespaceReplacement>, la même transformation MSBuild placée dans le fichier projet peut être appliquée à tous les packages correspondants :

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

Spécification

Ces remplacements ne seront exécutés que pour les éléments qui ne spécifient pas d'attribut.
Si @managedName est utilisé, vous choisissez de donner le nom souhaité exact, il ne sera pas traité plus loin.

Contrairement aux métadonnées inutilisées, ces remplacements ne déclenchent pas d’avertissement s’ils ne sont pas utilisés.

Respect de la casse

Les remplacements s’exécutent après la transformation automatique de la casse Pascal, mais la comparaison ne respecte pas la casse.

Par conséquent, les deux éléments suivants sont équivalents :

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

Limites de mot

Les remplacements n’ont lieu que sur des mots complets (parties d’espace de noms).

Donc

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

Correspond à Com.Google.Library, mais pas à Common.Google.Library ou Google.Imaging.Dicom.

Plusieurs mots complets peuvent être utilisés :

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

Position des mots

La correspondance de partie de mot peut être contrainte au début ou à la fin d’un espace de noms en ajoutant respectivement un . ou un ..

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

correspond Androidx.Core, mais pas Square.OkHttp.Androidx.

De même,

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

correspond à Google.AndroidX.Compose, mais pas à Google.Compose.Writer.

Le fait de préfixer et de suffixer un . en fait une correspondance exacte.

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

correspond Androidx, mais pas Google.Androidx.Core.

Ordre de remplacement

Les remplacements s’exécutent dans l’ordre spécifié par le <ItemGroup>, mais l’ajout à ce groupe à différents moments peut entraîner un ordre inattendu.

Les remplacements sont exécutés séquentiellement, et plusieurs remplacements peuvent affecter un espace de noms unique.

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

modifie Androidx.View en Microsoft.AndroidX.Views.

Relation avec les métadonnées

Techniquement, @(AndroidNamespaceReplacement) est implémenté en tant que cas particulier de <metadata>, et peut être placé directement dans un fichier metadata.xml.
formulaire de métadonnées si vous le souhaitez.

Autrement dit, l’élément MSBuild :

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

peut plutôt être placé dans metadata.xml sous la forme suivante :

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