Azure DevOps 构建管道损坏 unicode 文件名

问题描述 投票:0回答:1

我们有一个针对 .NET Framework 4.7.2 的遗留 .NET MVC 5 项目。我们使用经典界面在 Azure Devops 中创建了一个构建管道(稍后我们将切换到 YAML),并且我们有一个包含单个托管代理的托管代理池。管道指定使用“windows-latest”。

我们的问题是

App_Data
文件夹包含几个带有非ascii字符的文件,并且在构建的图像中这些文件名已损坏。举个例子。原始文件名
PuBavtalRegistervård.pdf
最终为
PuBavtalRegistervård.pdf
。如果您将后者作为 OEM850 编码字符串并将其解释为 UTF-8,那么您将获得原始文件名。因此,似乎在这个过程中,最初采用 unicode 的文件名被正确编码为 UTF-8,但随后该字符串被解释为 OEM850 并按原样发布到构建的映像中。

当我们从 Visual Studio (2022) 中构建时,不会出现此问题。在 VS 中,常规构建 (F5) 和发布(到文件系统)都可以正常工作。

管道使用此 MSBuild 命令行:

/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\"

有什么方法可以让它正确处理这些文件名吗?

unicode msbuild azure-pipelines filenames visual-studio-2022
1个回答
1
投票

只是想确认一下,在您的情况下,pdf 文件被用作构建的一部分,但您在构建时遇到错误?类似于复制文件到bin?

请描述更清楚地重现问题的具体步骤。


我认为问题可能与机器有关。

我注意到您提到了“windows-latest”和“当我们从 Visual Studio (2022) 中构建时,不会出现此问题。在 VS 中,常规构建 (F5) 和发布(到文件系统)都可以正常工作。” ,所以你在随机分配的Windows机器上遇到了错误,但是你在本地测试的Windows机器上可以成功,对吧?

如果是这样,一种可能的解决方案是使用自托管代理。这项技术可以确保您的管道运行的环境与本地机器一致。

您可以参考这个文档:

自托管代理

自托管 Windows 代理

这个技巧在你的情况下应该是可行的,它可以保证一致性。而且即使你不付费,只要你使用自托管代理,你就可以在私人项目中拥有免费的无限运行时间。 ms主机代理的机器是完全随机的。如果是自托管代理,可以预先配置环境。

顺便说一句,您还可以使用管道任务来更改文件的名称。

© www.soinside.com 2019 - 2024. All rights reserved.