글 작성자: HEROHJK
import os
import sys
from pathlib import Path

# 사용 가능한 Xcode 버전을 검색하고 목록으로 반환하는 함수
def find_xcode_versions():
    app_dir = Path('/Applications')
    xcode_versions = [entry for entry in app_dir.iterdir() if entry.is_dir() and entry.name.startswith('Xcode-')]
    return xcode_versions

# 심볼릭 링크를 생성하는 함수
def create_symlink(version):
    xcode_symlink = Path("/Applications/Xcode.app")

    if xcode_symlink.is_symlink():  # 기존 심볼릭 링크가 존재하면 삭제
        xcode_symlink.unlink()

    os.system(f"ln -s /Applications/{version} /Applications/Xcode.app")  # 새 심볼릭 링크 생성
    print(f"\033[32m심볼릭 링크가 /Applications/{version}로 설정되었습니다.\033[0m")

    # 기본 Xcode 버전을 설정
    os.system(f"sudo xcode-select -s /Applications/{version}/Contents/Developer")
    print(f"\033[32m기본 Xcode 버전이 {version}로 설정되었습니다.\033[0m")


def version_tuple(version_str):
    return tuple(map(int, (version_str.split("."))))

# 입력된 버전 문자열과 일치하는 가장 최신 버전을 반환하는 함수
def find_latest_matching_version(input_version, xcode_versions):
    matching_versions = [version for version in xcode_versions if version.name.startswith(f"Xcode-{input_version}")]
    if not matching_versions:
        return None

    latest_version = max(matching_versions, key=lambda x: version_tuple(x.name[6:-4]))
    return latest_version.name


def get_current_xcode_version():
    result = os.popen("xcode-select -p").read().strip()
    if "/Applications/" in result:
        xcode_path = result.split("/Contents/Developer")[0]
        current_version = os.path.basename(xcode_path)
        return current_version
    else:
        return None


def select_xcode_version():
    xcode_versions = find_xcode_versions()
    current_xcode_version = get_current_xcode_version()

    if not xcode_versions:
        print("\033[31mXcode 버전을 찾을 수 없습니다.\033[0m")
        return

    print("사용 가능한 Xcode 버전:")
    for idx, version in enumerate(xcode_versions, start=1):
        if version.name == current_xcode_version:
            print(f"\033[32m{idx}: {version.name} (현재 설정된 버전)\033[0m")
        else:
            print(f"\033[32m{idx}: {version.name}\033[0m")

    print("\033[31m0: 돌아가기\033[0m")

    while True:
        try:
            user_choice = int(input("사용할 Xcode 버전 번호를 선택하세요: "))
            if 1 <= user_choice <= len(xcode_versions):
                selected_version = xcode_versions[user_choice - 1].name
                create_symlink(selected_version)
                break
            elif user_choice == 0:
                exit()
            else:
                print("\033[31m목록에 없는 번호입니다. 다시 시도해주세요.\033[0m")
        except ValueError:
            print("\033[31m올바른 숫자를 입력해주세요.\033[0m")


if __name__ == "__main__":
    print("\n\n\n\n\n====================Xcode-Version-Selector====================")
    if len(sys.argv) > 1:
        input_version = sys.argv[1]
        xcode_versions = find_xcode_versions()
        xcode_version_names = [xcode_version.name for xcode_version in xcode_versions]

        matching_version = find_latest_matching_version(input_version, xcode_versions)

        if matching_version:
            create_symlink(matching_version)
        else:
            print("\033[31m입력한 버전과 일치하는 Xcode를 찾을 수 없습니다. 사용 가능한 버전 목록을 표시합니다.\033[0m")
            select_xcode_version()
    else:
        select_xcode_version()

 

Xcodes 앱은 Xcode를 설치할 때, 이렇게 설치를 해줍니다.

 

 

따라서, 빌드머신이나 스크립트로 ~/Applications/xcode.app 을 설정한 경우 경로를 찾을수 없어 난감해지는 경우가 있는데요,

 

심볼릭 링크를 만들고, xcode-select 커맨드를 이용하여 기본 버전으로 만들어 주어, 이를 해결해주는 파이썬 스크립트입니다.

 

저는 ~/.zshrc에 다음과같이 추가하여 사용하고 있습니다.

 

alias xcs='python3 /input_script_path/xcodeSelector.py'

 

그러면 터미널에 이렇게 입력하면 됩니다.

 

xcs
혹은
xcs 14.3

xcode의 버전은 네개로 나뉘어집니다.

 

14.3을 입력하면 14.3.x버전대의 가장 높은 버전을..

 

14를 입력하면 14.x.x 버전대의 가장 높은 버전을 선택 해 줍니다.

반응형