如何从构建阶段脚本中更改Xcode构建设置的环境变量?

3

在构建脚本的构建阶段更改Xcode BuildSettings环境变量是否可能?

整个想法如下: 我想发布一个带有单元测试的开源项目。 我的测试需要敏感数据,例如“登录”和“密码”,因此我不能硬编码它们。 我想通过进程环境传递登录信息,以便能够执行以下操作:

let login = ProcessInfo().environment["login"]!

我找到了一种方法,可以将构建设置环境中的变量传递给测试进程:选择“Tests”方案,进入环境变量并添加一个新值,名称为“login”,值为“$(login)”。 如果我在构建设置选项卡中设置“login”的值 - 它将像我预期的那样可以从ProcessInfo中访问。
但是,我想从项目根文件夹脚本文件“SetupCreds.sh”中设置“login”,该文件位于.gitignore中,因此在其中保留登录名和密码是安全的。 所以这个想法是:
  1. 添加构建阶段脚本
  2. 此脚本运行“SetupCreds.sh”
  3. “SetupCreds.sh”由导出行组成,如export login="MyLogin
如果我在构建阶段脚本中添加echo ${login},它会告诉我“login”实际上具有值“MyLogin”。 但是,这个导出仅影响构建阶段脚本环境,而不影响构建设置环境。
如何进行导出以覆盖构建设置环境变量? 或者也许有另一种方法可以实现我想要的?

使用xcconfig文件是否是一个选项?否则,可以将设置作为文件包含在测试包中。例如,在运行脚本构建阶段中复制它。 - Mats
谢谢你的回答。
  1. “Xcconfig”是一个非常好的建议,但我的配置是由pods生成的。此外,如果我尝试在脚本中更改项目配置 - git会注意到这一点。我试图找出如何在不被git注意到的情况下进行此操作,而无需更改项目。
  2. 复制也会被git注意到。 但我喜欢这个想法,并尝试理解是否可以选择性地将一个被git忽略的文件添加到测试目标中,如果该文件在构建时存在,则不会失败,如果该文件丢失,则通过Bundle的方法在测试中获取该文件。 谢谢!
- Vladlex
1
没错,它可以工作。 步骤:
  1. 在“复制资源”脚本之后添加一个脚本阶段。
  2. 脚本内容:
file="${SRCROOT}/${Tests.cfg}" if test -f $file then copy_target="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.xctest/Tests.cfg" cp -r $file $copy_target echo "Tests.cfg 文件已复制到 ${copy_target}" else echo "警告:未找到 Tests.cfg 文件。某些测试将被忽略。" fi
  1. 将“Tests.cfg”放入gitignore中。
  2. 创建“Tests.cfg”文件并填写敏感或特定于配置的值。
  3. 在测试中使用Bundle.for(type(of: self).self)获取“Tests.cfg” URL。
- Vladlex
你能把你最后的评论作为答案吗?它现在的形式很难阅读。 - Declan McKenna
1个回答

1
我已经将@Vladex在评论中提到的答案复制到这里,以便更容易阅读。
  1. 在“复制资源”脚本之后添加以下脚本阶段。
    $file then
    copy_target="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.xctest/Tests.cfg"
    cp -r $file $copy_target echo "Tests.cfg file copied to
    ${copy_target}" else echo "warning: No Tests.cfg file found. Some
    tests will be ignored." fi 
  1. 将 "Tests.cfg" 添加到 gitignore 中。
  2. 创建 "Tests.cfg" 文件并填写敏感或特定配置的值。
  3. 在测试中使用 Bundle.for(type(of: self).self) 获取 "Tests.cfg" 的 URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接