Swift에서 .env를 사용하여 환경 변수를 관리하는 방법
7628 단어 ShellScriptdotenvSwift
이번은 Swift로 개발하는 프로젝트로,
.env
파일을 사용해 환경 변수를 빌드시에 임베드하는 방법을 써 갑니다.Swift+Xcode 초보자이므로 실수 등이 있으면 알려주세요.
빌드시의 흐름
하는 일 자체는 간단하고, swift 파일마다 작성하고 있습니다.
.env
를로드하고 Environment.swift
를 만듭니다 우선 해보자
1. .gitignore에 추가
잘못 commit하지 않도록 먼저 추가해 둡시다.
여기 .env
와 함께 Environment.swift
도 추가해 둡니다.
.gitignore#(省略)
.env
Environment.swift
2. .env 준비
친숙한 파일을 준비. 장소는 프로젝트의 루트 바로 아래가 좋다고 생각합니다.
.envTWITTER_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
Environment.swift
TWITTER_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GYAZO_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
HOGEHOGE=xxxxxxxxxxxxxxxxxxxxxx
#!/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
"${SRCROOT}/buildEnv.sh" "${SRCROOT}/.env" "${SRCROOT}/${PROJECT}"
// ...省略
let twitterToken = Env["TWITTER_TOKEN"]
let clientId = Env["GYAZO_CLIENT_ID"]
.env
을 아티팩트에 포함 할 필요가 없습니다 Info.plist
에 쓸 필요가 없다(아티팩트의 내용 보면 데이터를 볼 수 있다)이번에 채택하지 않은 다른 방법
Info.plist에 갖게 하는 것이 일반적인 것일까요?
아티팩트의 내용을 볼 수 없는 경우(특히 iOS 앱 등)나, 누설도 거기까지 신경쓰지 않아도 좋은 경우는 좋은 것일지도 모릅니다.
끝에
평상시 Web계의 언어에 접하고 있으면 당연과 같다.
애초에 별로 정보가 없었던 것은, iOS 앱 등을 git 관리해 OSS로 공개하는 것이 상정되어 있지 않기 때문인가…
뭔가 의견 등 있으면, 코멘트 기다리고 있습니다 🙇♂️
평상시 Web계의 언어에 접하고 있으면 당연과 같다.
애초에 별로 정보가 없었던 것은, iOS 앱 등을 git 관리해 OSS로 공개하는 것이 상정되어 있지 않기 때문인가…
뭔가 의견 등 있으면, 코멘트 기다리고 있습니다 🙇♂️
Reference
이 문제에 관하여(Swift에서 .env를 사용하여 환경 변수를 관리하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sskmy1024y/items/30b25ba5ad8d56448ffc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)