Swift에서 .env를 사용하여 환경 변수를 관리하는 방법

최근 Swift를 만졌습니다.

이번은 Swift로 개발하는 프로젝트로, .env 파일을 사용해 환경 변수를 빌드시에 임베드하는 방법을 써 갑니다.
Swift+Xcode 초보자이므로 실수 등이 있으면 알려주세요.

빌드시의 흐름



하는 일 자체는 간단하고, swift 파일마다 작성하고 있습니다.
  • Run Script에서 쉘 스크립트 호출
  • 스크립트에서 .env를로드하고 Environment.swift를 만듭니다
  • Environment.swift를 사용하여 빌드 실행

  • 우선 해보자



    1. .gitignore에 추가



    잘못 commit하지 않도록 먼저 추가해 둡시다.
    여기 .env 와 함께 Environment.swift 도 추가해 둡니다.

    .gitignore
    #(省略)
    
    .env
    Environment.swift
    

    2. .env 준비



    친숙한 파일을 준비. 장소는 프로젝트의 루트 바로 아래가 좋다고 생각합니다.

    .env
    TWITTER_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    GYAZO_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
    HOGEHOGE=xxxxxxxxxxxxxxxxxxxxxx
    

    3. 쉘 스크립트 작성


    .env 를 읽고 Environment.swift 를 생성하는 shellscript입니다.
    인수를 2개 취해, 1번째가 .env의 path, 2번째가 출력처입니다.

    보존처는, 이쪽도 프로젝트 루트 바로 아래가 좋다고 생각합니다.

    buildEnv.sh
    #!/bin/sh
    # Copyright (c) 2021 Sho YAMASHITA
    
    code=$(cat <<EOS
    
    import Cocoa
    
    let Env: [String: String] = [
    
    EOS
    )
    
    if [ $# -ne 2 ]; then
      echo "require 2 arguments." 1>&2
      echo "./buildEnv.sh /path/to/.env /output/path" 1>&2
      exit 1
    fi
    
    if [ -f "$1" ]; then
        while IFS='' read -r line || [[ -n "$line" ]]; do
            line="${line//[$'\r\n']}"
            trimline="${line//[$'\t\r\n ']}"
            if [ -n "$trimline" ]; then
                KEY="${line%%=*}"
                VALUE="${line##*=}"
                code=$(cat <<EOS
            $code
            "$KEY": "$VALUE",
    EOS
    )
            fi
        done < "$1"
    fi
    
    code=$(cat <<EOS
    $code
    ]
    EOS
    )
    
    echo "${code}" > "$2/Environment.swift"
    
    exit 0
    
    import Cocoa 부분은 필요에 따라서 변경해 주세요.

    4. Run Script 추가



    Xcode의 TARGETS < Build Phases를 열고 왼쪽 상단의 + 버튼에서 Run Script를 추가하십시오.
    이 때 정렬 순서를 Compile Souces 앞에 오도록 배치하십시오.

    추가한 후 다음과 같이 명령을 입력합니다.
    "${SRCROOT}/buildEnv.sh" "${SRCROOT}/.env" "${SRCROOT}/${PROJECT}"
    



    여기서 먼저 1회 Build 혹은 Run 해 봅시다.
    잘하면 프로젝트 디렉토리 아래에 Environment.swift가 생성되어야합니다.

    5. 환경 변수(.env)의 값 사용



    생성 된 Environment.swift를 프로젝트에 추가하면 나머지는 변수로 사용할 수 있습니다.Env["<.envに書いたキー>"] 로 호출할 수 있습니다.

    Example.swift
        // ...省略
        let twitterToken = Env["TWITTER_TOKEN"]
        let clientId = Env["GYAZO_CLIENT_ID"]
    

    생성된 환경 변수는 모두 String형이 되어 있으므로, 정수형으로서 사용하고 싶은 경우 등은 캐스트 해 주세요.
    이상으로 끝입니다.

    이 방법의 장점


  • .env을 아티팩트에 포함 할 필요가 없습니다
  • Info.plist 에 쓸 필요가 없다(아티팩트의 내용 보면 데이터를 볼 수 있다)
  • 관리 대상 코드를 덮어 쓰지 않으므로 git 관리가 쉽습니다.

    이번에 채택하지 않은 다른 방법



    Info.plist에 갖게 하는 것이 일반적인 것일까요?
    아티팩트의 내용을 볼 수 없는 경우(특히 iOS 앱 등)나, 누설도 거기까지 신경쓰지 않아도 좋은 경우는 좋은 것일지도 모릅니다.



    끝에



    평상시 Web계의 언어에 접하고 있으면 당연과 같다.
    애초에 별로 정보가 없었던 것은, iOS 앱 등을 git 관리해 OSS로 공개하는 것이 상정되어 있지 않기 때문인가…

    뭔가 의견 등 있으면, 코멘트 기다리고 있습니다 🙇‍♂️
  • 좋은 웹페이지 즐겨찾기