我们使用 Xamarin Forms 构建移动应用程序,而 macOS 构建 iOS 应用程序。我们今天遇到了一个让我摸不着头脑的问题。
带有嵌入式资源文件的正常构建如下所示:
CoreResGen:
/Library/Frameworks/Mono.framework/Versions/5.16.0/lib/mono/4.5/resgen.exe /useSourcePath
[....all of our references....]
/compile
Resources/HtmlStyleRes.resx,obj/BuildAgentRelease_iOS/ForumApp.Common.Resources.HtmlStyleRes.resources
Resources/TextRes.resx,obj/BuildAgentRelease_iOS/ForumApp.Common.Resources.TextRes.resources
Resources/TextRes.nb.resx,obj/BuildAgentRelease_iOS/ForumApp.Common.Resources.TextRes.nb.resources
所以那里没有惊喜;.resx 文件被编译为具有程序集命名空间 + 文件夹名称 + resx 文件名的二进制 .resources 文件。
但是,我们对构建服务器上的目录结构进行了更改,这改变了 CoreResGen 的输出:
CoreResGen:
/Library/Frameworks/Mono.framework/Versions/5.16.0/lib/mono/4.5/resgen.exe /useSourcePath
[....all of our references....]
/compile
Resources/HtmlStyleRes.resx,obj/BuildAgentRelease_iOS/ForumApp.Common.HtmlStyleRes.resources
Resources/TextRes.resx,obj/BuildAgentRelease_iOS/ForumApp.Common.TextRes.resources
Resources/TextRes.nb.resx,obj/BuildAgentRelease_iOS/ForumApp.Common.TextRes.nb.resources
请注意“资源”文件夹是如何从 .resources 文件名中删除的。当编译到应用程序中时,这会导致我们的应用程序在运行时崩溃,因为资源文件命名空间现在不同了。
我们使用自托管的 Azure 代理构建我们的应用程序。所有应用程序都是从同一个存储库构建的,作为简化构建服务器的努力的一部分,我们实施了一个管道任务,为所有构建使用一个公共存储库文件夹。Azure 代理通常会从 _work/build-id/s 构建,我们的管道任务会将这个目录符号链接到 _work/g/repo-id,以便多个构建可以共享同一个存储库。
当我们使用 _work/build-id/s 中的 repo 构建时,一切都很好。当我们使用符号链接的 repo 构建时,会发生文件命名空间错误。
据我们所知,这发生在 macOS 上,但不在 Windows 上。
我们有一个可能在 macOS 上发生的相关问题,但在 Windows 上没有。以下输出来自使用单声道的 macOS:
Path.GetDirectoryName(@"Resources\TextRes.resx") => ""
Path.GetDirectoryName(@"Resources/TextRes.resx") => "Resources"
Path.GetDirectoryName 在CreateCSharpManifestResourceName中用于从 Resources\TextRes.resx 创建输出文件名,但似乎有将 \ 替换为 / 的守卫,我不明白为什么符号链接源文件夹会触发它。
有没有人经历过这个?我错过了一些明显的东西吗?