如何在GitHub Windows运行器中安装测试区域设置以支持setlocale()
解决GitHub Windows运行器上Perl本地化测试的Locale问题
问题概述
为Sqitch添加的本地化测试要求POSIX setlocale()返回正确的UTF-8 locale值,Linux和macOS环境通过安装对应语言包即可正常运行,但Windows环境下设置LC_ALL=en-US.UTF-8时,Perl会提示locale未安装并回退到English_United States.1252编码。尝试使用Install-Language命令安装语言包时,因命令未被识别而失败。
解决方案
1. 使用DISM命令安装语言包(管理员权限)
GitHub Windows运行器基于Windows Server 2022,默认未预装LanguagePackManagement模块,因此无法直接使用Install-Language。改用DISM命令以管理员权限安装语言包,步骤如下:
在GitHub工作流中添加以下步骤:
- if: runner.os == 'Windows' name: Install UTF-8 Language Packs shell: powershell run: | # 以管理员身份运行DISM安装语言包 $packages = @('fr-fr', 'en-us', 'de-de', 'it-it') foreach ($lang in $packages) { $pkg = Get-WindowsPackage -Online | Where-Object { $_.PackageName -like "*LanguagePack-$lang*" } | Select-Object -First 1 if ($pkg) { Start-Process dism.exe -ArgumentList "/Online /Add-Package /PackagePath:`"$($pkg.PackagePath)`"" -Wait -NoNewWindow -Verb RunAs } else { Write-Warning "Language pack for $lang not found" } }
2. 启用UTF-8系统区域设置
Windows需要启用UTF-8全局语言支持才能让setlocale()识别en-US.UTF-8这类格式,在工作流中添加以下配置:
- if: runner.os == 'Windows' name: Enable UTF-8 System Locale shell: powershell run: | # 修改注册表启用UTF-8支持 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name 'ACP' -Value 65001 -Type DWord Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name 'OEMCP' -Value 65001 -Type DWord Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name 'MACCP' -Value 65001 -Type DWord
3. 调整Perl测试步骤的环境变量
确保测试步骤的环境变量正确设置:
- run: perl -MPOSIX -E "say POSIX::setlocale(POSIX::LC_ALL)" env: LC_ALL: fr_FR.UTF-8 LANG: fr_FR.UTF-8 shell: powershell
完整工作流示例
name: Test setlocale on: [push] jobs: test: name: Test setlocale runs-on: windows-latest steps: - uses: actions/checkout@v4 - uses: shogo82148/actions-setup-perl@v1 with: perl-version: latest - name: Install UTF-8 Language Packs shell: powershell run: | $packages = @('fr-fr', 'en-us', 'de-de', 'it-it') foreach ($lang in $packages) { $pkg = Get-WindowsPackage -Online | Where-Object { $_.PackageName -like "*LanguagePack-$lang*" } | Select-Object -First 1 if ($pkg) { Start-Process dism.exe -ArgumentList "/Online /Add-Package /PackagePath:`"$($pkg.PackagePath)`"" -Wait -NoNewWindow -Verb RunAs } else { Write-Warning "Language pack for $lang not found" } } - name: Enable UTF-8 System Locale shell: powershell run: | Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name 'ACP' -Value 65001 -Type DWord Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name 'OEMCP' -Value 65001 -Type DWord Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name 'MACCP' -Value 65001 -Type DWord - run: perl -MPOSIX -E "say POSIX::setlocale(POSIX::LC_ALL)" env: LC_ALL: fr_FR.UTF-8 LANG: fr_FR.UTF-8
关键说明
- DISM命令需要管理员权限,通过
Start-Process的-Verb RunAs参数实现 - 修改注册表启用UTF-8后,GitHub Actions环境中通常无需额外重启即可生效
- Windows的语言包名称格式为
LanguagePack-xx-xx,需对应目标locale的小写格式
内容的提问来源于stack exchange,提问作者theory
相关产品推荐
相关产品推荐

