問題
Xcodeのbuild scriptをみんな知っていると思う。
そう、このやろうだよ。便利だよね? このスクリプトに環境変数を渡したいんだ
プロジェクトチームで共通な環境変数であば User Definedの配下の変数として入れればいい。ここに入れるとXcodeもgitも管理することになる。Run Script実行の直前にXcodeが管理している環境変数全て渡すので プロジェクト共通・チーム共通の変数であればこれ対応完了!
しかし、Xcodeが管理していない環境変数(開発者によって値が異なる変数)ならば そんなこと通用しない。
JAVA_HOMEはその例の1つである。JDKは色々ある、ディレクトリーも人それぞれだ。(もう、今さら誰もJavaを使ってXcodeで何かやっている人がいないと思っているかもしれないが Kotlin Multiplatform (KMP)というフレームワークがあり Kotlinコードをコンパイルし.frameworkという形にすることでAndroidと共通でコードが書ける! この仕組みはRun Scriptを利用していて、中でgradleが利用される。時々JDKのバージョンが合っていないとエラーになる。不一致エラーの場合は明示的にJAVA_HOMEをセットしてあげる必要がある。)
大抵の人は JAVA_HOMEを設定する必要ないが、もし必要となったらこの方法が役に立つかもしれない...
方法1: Xcode全体の設定を変更
Xcode > Settings > Locations > Custom Paths あたりで設定する。
上記のように自分だけの環境変数を定義する
メリット | デメリット |
---|---|
シンプル、手軽 |
~/.zshenv や ~/.zshrc ファイルでJAVA_HOMEを既に管理している可能性がある、その場合は 2重管理になってしまうかもしれない。 |
方法2: zshに切り替え
ステップ1: Run ScriptのShellの値を /bin/sh
から /bin/zsh
に変更。
ステップ2: 、~/.zshenv
ファイルに 自分の環境変数を定義。(私はSDKMANユーザーだからこんな感じ)
export JAVA_HOME="${HOME}/.sdkman/candidates/java/current"
メリット | デメリット |
---|---|
~/.zshenv を利用しているので 2重管理にならない。*nix系のshellを理解している人にとっては 極自然でわかりやすい |
メリットがデメリットにもなる。~/.zshenv の影響を受けて、~/.zshenv 色々と書けてしまうのでビルドにも影響するかもしれない |
Shellの値を/bin/sh
から /bin/zsh
に変えると どうしてzshenvが呼ばれるの?
まずXcodeのRun scriptの実行のための前処理を理解しよう
Xcodeが
- RunScriptのShell値を使って shebangにする。一時ファイル(例:
script.sh
)として保存 - RunScriptの中身を一時ファイルにappendする
-
Non interactive(-cオプション)として実行する。(例:
/bin/sh -c script.sh
)
ということでscript.shの中にあるshebangで内部のシェルが決まり、Startup Fileの仕組みを活かせる!
shebangは #!/bin/sh だとbash利用される。bashのnon-interactiveシェルの場合は デフォルトではstartup fileとして何も呼ばれない。~/.profile
, ~/.bash_profile
当然読み込まれないから 環境変数が読み込まれない。詳細: Bash Startup File(Bash Reference Manual
A non-interactive shell invoked with the name sh does not attempt to read any other startup files.
一方、shebangは #!/bin/zsh だとzshが利用される。zsh世界ではinteractiveだろうがnon-interactiveだろうが ~/.zshenv
が読まれる。ここ環境変数を置く場所だ! 詳細: An introductionto the Z Shell - Startup Files
`.zshenv' is sourced on all invocations of the shell, unless the -f option is set. It should contain commands to set the command search path, plus other important environment variables.
以上!役に立ったのでしょうか?
See you later! 🐊