通过


自定义命名空间

Java 包名称通常与 C# 命名空间约定不匹配,因为存在额外的前缀和大写差异等问题。

例如,Java 包名称 com.microsoft.streamwriters 将自动转换为 Com.Microsoft.Streamwriters ,因为绑定过程会自动将命名空间转换为 Pascal 大小写。 然而,更合适的选择是 Microsoft.StreamWriters

可以通过向项目文件添加项 <AndroidNamespaceReplacement> 来实现此目的:

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

尽管 Java 包也可以使用传统 metadata包进行重命名,但重命名许多类似的包可能很繁琐:

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

使用<AndroidNamespaceReplacement>,可以将项目文件中放置的相同 MSBuild 变换应用于所有匹配的包。

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

规范

这些替换项仅针对<package>未指定metadata@managedName属性的元素运行。
如果使用@managedName,则表示选择提供明确的所需名称,它将不会被进一步处理。

与未使用的元数据不同,如果未使用,这些替换项将不会引发警告。

事例敏感性

替换在自动 Pascal 大小写转换后执行,但比较时不区分大小写。

因此,以下两项都是等效的:

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

词边界

替换操作仅在完整单词(命名空间部分)上进行

因此,

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

匹配Com.Google.Library,但不匹配Common.Google.LibraryGoogle.Imaging.Dicom

可以使用多个完整单词:

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

单词位置

单词部分匹配可以通过在命名空间的结尾附加 . 或在开头加上 . 来限制。

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

Androidx.Core匹配,但Square.OkHttp.Androidx不匹配。

类似地,

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

Google.AndroidX.Compose 匹配,但不匹配 Google.Compose.Writer

在前面添加和在后面附加.都会使其精确匹配。

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

匹配Androidx,但不匹配Google.Androidx.Core

替换顺序

替换项按照<ItemGroup>指定的顺序运行,然而在不同时间添加到此组可能会导致顺序意外。

替换按顺序运行,多个替换可能会影响单个命名空间。

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

Androidx.View 更改为 Microsoft.AndroidX.Views

与元数据的关系

技术上,@(AndroidNamespaceReplacement) 是作为 <metadata> 的特殊情况实现的,并且可以直接放置在 metadata.xml 文件中。
元数据表单(如果需要)。

也就是说,MSBuild 的项目条目:

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

可以改为放置在 metadata.xml

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