Naamruimten aanpassen

Java-pakketnamen komen vaak niet overeen met C#-naamruimteconventies vanwege problemen zoals extra voorvoegsels en hoofdletterverschillen.

Bijvoorbeeld, de naam com.microsoft.streamwriters van het Java-pakket wordt automatisch naar Com.Microsoft.Streamwriters vertaald, omdat het bindingsproces naamruimten automatisch naar Pascal case vertaalt. Maar een betere pasvorm zou zijn Microsoft.StreamWriters.

U kunt dit doen door een <AndroidNamespaceReplacement> item toe te voegen aan het projectbestand:

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

Hoewel Java-pakketten ook kunnen worden hernoemd met traditionele metadata, kan het lastig zijn om veel vergelijkbare pakketten te hernoemen:

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

Met <AndroidNamespaceReplacement>kan dezelfde MSBuild-transformatie die in het projectbestand wordt geplaatst, worden toegepast op alle overeenkomende pakketten:

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

Specification

Deze vervangingen worden alleen uitgevoerd voor <package> elementen die geen kenmerk opgeven metadata@managedName .
Als u ervoor kiest @managedName te gebruiken en de exacte gewenste naam opgeeft, zal deze niet verder worden verwerkt.

In tegenstelling tot ongebruikte metagegevens wordt door deze vervanging geen waarschuwing gegenereerd als deze niet worden gebruikt.

Hoofdlettergevoelig

Vervangingen worden uitgevoerd na de automatische Pascal-casetransformatie, maar het vergelijken is niet hoofdlettergevoelig.

Beide van de volgende zijn dus gelijkwaardig:

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

Woordgrenzen

Vervangingen vinden alleen plaats op volledige woorden (naamruimteonderdelen).

Dus

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

Komt overeen met Com.Google.Library, maar niet met Common.Google.Library of Google.Imaging.Dicom.

Meerdere volledige woorden kunnen worden gebruikt:

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

Positie van Word

De overeenkomst van woorddelen kan worden beperkt tot het begin of einde van een naamruimte door respectievelijk een . toe te voegen of een . voor te plaatsen.

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

komt overeen Androidx.Core, maar niet Square.OkHttp.Androidx.

Dit is vergelijkbaar met het volgende.

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

komt overeen Google.AndroidX.Compose, maar niet Google.Compose.Writer.

Zowel het voorvoegen als het toevoegen van een . maakt het een exacte overeenkomst.

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

komt overeen Androidx, maar niet Google.Androidx.Core.

Vervangingsorder

Vervangingen worden uitgevoerd in de volgorde die is opgegeven door de <ItemGroup>, maar het toevoegen aan deze groep op verschillende tijdstippen kan leiden tot een onbedoelde volgorde.

Vervangingen worden opeenvolgend uitgevoerd en meerdere vervangingen kunnen van invloed zijn op één naamruimte.

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

verandert Androidx.View in Microsoft.AndroidX.Views.

Relatie tot metagegevens

Technisch gezien wordt @(AndroidNamespaceReplacement) geïmplementeerd als een speciaal geval van <metadata>, en kan rechtstreeks in een metadata.xml bestand worden geplaatst.
formulier met metagegevens indien gewenst.

Dat wil gezegd, het MSBuild-item:

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

kan in plaats daarvan worden geplaatst metadata.xml als:

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