在 Xcode 构建阶段运行脚本中设置全局环境变量

Posted

技术标签:

【中文标题】在 Xcode 构建阶段运行脚本中设置全局环境变量【英文标题】:Set global environment variables inside Xcode build phase run script 【发布时间】:2012-04-20 05:50:17 【问题描述】:

我正在使用 Jenkins 进行持续集成构建。我有很多工作都有很多相同的配置代码。我正在将这一切都提取到一个我想在构建前后运行的通用脚本文件中。

我一直无法弄清楚如何在该脚本中设置一些环境变量,以便 Xcode 构建命令和 Jenkins 构建都可以看到它们。

有谁知道这是否可行?

【问题讨论】:

也许这个答案会有所帮助 - ***.com/a/32743908/67824。它不允许您定义全局环境变量,但它确实允许您更改 xcodeproj 构建设置,这可能是您想要的环境变量(至少对我来说是这样)。 【参考方案1】:

不可能完全按照您的要求去做。一个进程不能改变另一个进程的环境变量。前、后和实际的构建步骤在不同的进程中运行。

但您可以创建一个脚本来设置公共环境变量并在所有构建之间共享该脚本。

会先调用你的shell来执行脚本中的命令,然后调用xcodebuild:

# Note the dot in the beginning of the next line. It is not a typo.
. set_environment.sh
xcodebuild myawesomeapp.xcodeproj

脚本可能如下所示:

export VARIABLE1=value1
export VARIABLE2=value2

您的作业将如何共享脚本取决于您的环境和用例。你可以

将脚本放置在 Jenkins 主机上的某个知名位置或 如果您的所有作业共享同一个存储库,则将脚本放在版本控制的源代码树中,或者 将脚本放在它自己的存储库中,并制作一个 Jenkins 构建,将脚本归档为构建工件。然后所有其他作业将使用 Copy Artifact 插件从脚本作业的工件中获取脚本的副本。

【讨论】:

我看不出这有什么帮助。我(和许多其他人)正在研究这个的原因是,通过设置环境变量,一个构建步骤影响下一个构建步骤的能力。在我的情况下,即使设置一个预定义的处理器宏就足够了,但你的答案都没有。或者你的意思是某个构建步骤应该写入导出变量的脚本,并由所有其他目标运行?【参考方案2】:

从Apple's Technical Q&A QA1067 看来,如果您创建文件/Users/YOU/.MacOSX/environment.plist 并使用所需的环境变量填充它,那么所有进程(由用户在其主目录中使用 environment.plist 文件启动)都会选择这些环境变量。您可能需要重新启动计算机(或者只是注销并重新登录),然后新启动的进程才会获取变量。This article 还声称 Xcode 也会将这些变量传递给构建阶段脚本。我还没有测试过,但下次我重新启动我的 MacBook 时,我会告诉你它是否有效。

来自http://developer.apple.com/library/mac/#/legacy/mac/library/qa/qa1067/_index.html

Q: How do I set environment for all processes launched by a specific user?


A: It is actually a fairly simple process to set environment variables for processes launched by a specific user.

loginwindow 会搜索一个特殊的环境文件 每次用户登录时,环境文件为: ~/.MacOSX/environment.plist(注意区分大小写)。在哪里 '~' 是我们感兴趣的用户的主目录。你将 必须使用终端自己创建 .MacOSX 目录(通过 键入 mkdir .MacOSX)。您还必须创建环境 自己归档。环境文件实际上是XML/plist格式 (确保将 .plist 扩展名添加到文件名的末尾或 这不起作用)。

【讨论】:

成功了吗?我无法让 xcode 使用这种方法查看我的变量...

以上是关于在 Xcode 构建阶段运行脚本中设置全局环境变量的主要内容,如果未能解决你的问题,请参考以下文章

从 Node.js 中设置全局环境变量

shell脚本中的全局环境变量

在python脚本中设置环境变量

dockerfile镜像脚本中设置环境变量的是哪一项

在方案中设置构建变量而不是目标

Xcode 持续集成:在执行后脚本期间检测 CI 环境