Changes the current Xcode
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci
share/chxcode
test
.travis.yml
CHANGELOG.md
LICENSE
Makefile
README.md

README.md

chxcode

Build Status

Changes the current Xcode.

Installation

brew tap klaaspieter/formula
brew install chxcode

Usage

With the following in your .bashrc, .zshrc file:

source /usr/local/share/chxcode/chxcode

List available Xcodes:

$ chxcode
  9.2
  9.3
  9.4

Select Xcode for the current shell:

$ chxcode 9.3
$ chxcode
  9.2
* 9.3
  9.4
$ echo "$DEVELOPER_DIR"
/Applications/Xcode-9.3.app/Contents/Developer

Auto-switching

To automatically switch the current Xcode version when you cd between different directories, load auto in ~/.bashrc or .zshrc:

source /usr/local/share/chxcode/chxcode
source /usr/local/share/chxcode/auto

Auto looks for an .xcode-version file and automatically selects that version for the current folder and any of it's subfolders.

For example:

$ xcode-select -p
/Applications/Xcode-9.4.app/Contents/Developer
$ chxcode
  9.2
  9.3
* 9.4
$ echo "9.3" > project/.xcode-version
$ cd project
$ xcode-select -p
/Applications/Xcode-9.3.app/Contents/Developer
$ chxcode
  9.2
* 9.3
  9.4

Xcodes

When chxcode is sourced it auto-detects installed Xcodes. After installing a new Xcode you must restart the shell before chxcode can find them.

How it works

chxcode uses Spotlight (through mdfind) to search for the com.apple.dt.Xcode bundle identifier. It then uses mdls to find the Xcode version. Switching Xcodes is done by setting the DEVELOPER_DIR environment variable.

man xcode-select on the DEVELOPER_DIR environment variable:

Overrides the active developer directory. When DEVELOPER_DIR is set, its value will be used instead of the system-wide active developer directory.

Test

With shunit2 installed, run:

$ ./test/runner

To run individual test files:

# Interactive shell
zsh -i test/[name]_test
bash -i test/[name]_test

# Non-interactive shell
zsh test/[name]_test
bash test/[name]_test

Acknowledgements