Xcode持续弹出Swift包仓库密码输入框,如何解决?
解决Swift包依赖授权时Xcode弹出密码框卡住的问题
问题背景
我在Artifactory的Swift包仓库中有一个需账号密码授权的包。在GitLab CI或本地构建时,解析包依赖图会因Xcode弹出密码输入框而卡住。尝试过以下方法但均无效:
- 使用fastlane的
unlock_keychain解锁钥匙串 - 通过
security add-internet-password -a $1 -s <url> -r https -w $2 -T /Applications/Xcode.app -T /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild命令手动将密码添加到钥匙串并授权Xcode访问 - 使用带
--disable-keychain和--enable-netrc选项的swift package-registry login命令
需要找到无需在每台构建机上手动勾选“始终允许”的解决办法。
可行解决方案
1. 修复钥匙串凭证添加命令(核心解决权限问题)
你之前的security add-internet-password命令缺少关键参数,导致权限未正确授予。使用以下命令添加凭证,直接设置“始终允许”权限:
security add-internet-password \ -a "$ARTIFACTORY_USERNAME" \ -s "your-artifactory-domain.com" \ -r "https" \ -w "$ARTIFACTORY_PASSWORD" \ -T "/Applications/Xcode.app" \ -T "/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild" \ -T "/usr/bin/swift" \ -U
-U参数会自动将访问权限设置为“允许”,跳过手动勾选步骤- 必须添加
/usr/bin/swift的授权,因为Swift包管理器本身也会直接访问仓库
2. 用.netrc文件自动提供凭证
通过创建.netrc文件让SwiftPM直接读取账号密码,无需依赖钥匙串:
- 在用户根目录生成
.netrc文件:
echo "machine your-artifactory-domain.com login $ARTIFACTORY_USERNAME password $ARTIFACTORY_PASSWORD" > ~/.netrc
- 严格设置文件权限为600(SwiftPM会忽略权限过宽的
.netrc):
chmod 600 ~/.netrc
- 确保SwiftPM启用netrc支持:
- 构建时添加参数:
swift build --enable-netrc - 或设置环境变量:
export SWIFTCI_USE_NETRC=1
- 构建时添加参数:
3. GitLab CI专用临时钥匙串方案
在CI流水线中创建独立的临时钥匙串,规避系统钥匙串的权限限制:
# 创建临时钥匙串并设置密码 security create-keychain -p "$CI_KEYCHAIN_PASSWORD" build.keychain # 将临时钥匙串设为默认 security default-keychain -s build.keychain # 解锁钥匙串 security unlock-keychain -p "$CI_KEYCHAIN_PASSWORD" build.keychain # 禁用钥匙串自动锁定(避免构建超时) security set-keychain-settings -t 3600 -l ~/Library/Keychains/build.keychain # 添加凭证到临时钥匙串并授权所有相关工具 security add-internet-password \ -a "$ARTIFACTORY_USERNAME" \ -s "your-artifactory-domain.com" \ -r "https" \ -w "$ARTIFACTORY_PASSWORD" \ -T "/Applications/Xcode.app" \ -T "/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild" \ -T "/usr/bin/swift" \ -U \ build.keychain
CI环境使用独立钥匙串,不会受系统钥匙串的权限弹窗影响。
4. 命令行触发Xcode依赖解析并指定钥匙串
直接通过xcodebuild命令触发依赖解析,同时指定使用已配置好的钥匙串:
xcodebuild -resolvePackageDependencies \ -package-path ./YourPackageDirectory \ -authenticationKeychain build.keychain
结合临时钥匙串使用,确保Xcode在解析依赖时自动读取凭证,不会弹出密码框。
内容的提问来源于stack exchange,提问作者scandyz
相关产品推荐
相关产品推荐

