Xcode custom script 시작하기

Lily·2023년 3월 6일
1

안녕하세요! 릴리입니다~
오늘은 Xcode의 Build phase에서 custom script를 실행하는 방법과 용어들에 대해 초심자의 눈으로 하나하나 알아보도록 하겠습니당🤓


Intro: script 얼렁뚱땅 써본 적은 이씀

우선 저는 SwiftGen.string파일을 타입으로 자동 생성하기위해 Build phase에서 script를 실행시켜본 적은 있습니다.

두 번 모두 글에서 사용 방법을 하나 하나 알려주셨기 때문에 하라는 대로 하니 스크립트를 정상적으로 실행할 수 있었습니다. 하지만... script는 뭐고..? Input FileOutput File은 뭔지..알지도 못하고 사용하니 찜찜하더군요.. 결국 스크립트를 수정하다보니 무엇을 어떻게 건들여야할지 감조차 잡히지 않는 결과를. . .🤦‍♀️

그래서 오늘 제대로 알기 위해 포스팅을 작성하게 되었습니다!


Shell Script가 뭐지?

셸 스크립트(shell script)는 이나 명령 줄 인터프리터에서 돌아가도록 작성되었거나 한 운영 체제를 위해 쓰인 스크립트이다. 단순한 도메인 고유 언어로 여기기도 한다. 셸 스크립트가 수행하는 일반 기능으로는 파일 이용, 프로그램 실행, 문자열 출력 등이 있다. - 위키백과 -

  • 셸(shell): 운영 체제 상에서 다양한 운영 체제 기능과 서비스를 구현하는 인터페이스를 제공하는 프로그램이다. 셸(껍데기의 영어 단어)은 사용자와 운영 체제의 내부(커널) 사이의 인터페이스를 감싸는 층이기 때문에 그러한 이름이 붙었다. 유닉스에는 본 셸(sh), C 셸(csh), 콘 셸(ksh), 스키마 셸(scsh), Z셸(zsh)이 있다.

  • 명령어 인터프리터(command-line interpreter) : 입력된 명령어를 읽고 명령어를 하나 이상의 시스템 호출로 변환함으로써 실행시키는 프로그램.

  • 스크립트 언어(script language) : 응용 소프트웨어를 제어하는 컴퓨터 프로그래밍 언어. 스크립트 언어는 응용 프로그램과 독립하여 사용되고 일반적으로 응용 프로그램의 언어와 다른 언어로 사용되어 최종사용자가 응용 프로그램의 동작을 사용자의 요구에 맞게 수행할 수 있도록 해준다.

운영체제의 기능을 이용할 수 있는 프로그래밍 언어이며 쉘이나 명령 줄 인터프리터에서 실행되는 언어라고 이해했다. 특징들은 아래와 같다.

  • .sh라는 파일 확장자를 가진 파일이 특정 종류의 셸 스크립트를 가리키는 것이 보통이지만, 대부분의 셸 스크립트는 파일 확장자를 지니지 않는다.
  • 컴파일 단계가 없기 때문에 디버깅을 하는 동안 빠르게 실행 가능하다

Build phase는 뭐지?

쉘 스크립트 언어는 Build phase에서 추가할 수 있다.
그렇다면 Build Phase는 뭘 하는 단계일까?

타겟을 빌드할 때 타겟 별로 개별 태스크를 설정하는 단계이다.


New Run script phase를 하면?

이제 Build phase에서 + 버튼을 눌러서 New Run script phase를 클릭하면 빌드 단계 동안 특정 셸 스크립트 언어를 실행할 수 있다.

  • 스크립트는 $(SRCROOT), 타겟의 소스 파일을 포함하는 디렉토리와 같이 타겟의 빌드 셋팅을 참조할 수 있다.
  • input, output file의 리스트를 제공할 수 있다.
  • input과 output 파일이 없을 땐 스크립트는 빌드될 때마다 항상 실행된다.
  • 반면 input과 output 파일이 있을 땐 전에 실행된 적이 없거나, input 파일 중 하나라도 수정되었거나, output 파일이 하나라도 없어졌을 때 실행된다.
  • run script는 모든 빌드에서 가능할 수도, 또는 installation build 동안만, 또는 하나의 타겟당 여러번의 run script가 추가될 수 있다.
  • 타겟의 다른 build phase(컴파일 및 링크 빌드 단계등)와 별도로 실행된다.

Run script의 각 메뉴 살펴보기

원문 : 📄 Article: Running custom scripts during a build

Shell script environment 란?

Shell이라는 제목 옆에는 /bin/sh가 쓰여 있고,
이 곳에 shell script environment를 쓰라고 안내되어 있다.

실행될 셸의 경로를 적어주면 된다.

/bin/sh는 기본 셸을 사용하겠다는 의미이다.
sh본 셸(Bourne shell)의 줄임말로 유닉스의 기본 셸이다.


script 제공하기

실행할 스크립트를 아래 칸에 작성하거나, 스크립트 파일의 경로를 작성한다.

Input, Ouptut File 이란?

Input File로는 스크립트가 처리할 데이터를 제공할 수 있고,
Output file은 script에 의해 생성된 데이터를 저장할 수 있다.

2가지 방법으로 input, output file을 적을 수 있다.

  1. 각 파일의 path를 string으로 제공하는 방법
    파일의 경로를 빌드하기 전 미리 알고 있거나, 바뀌지 않을 것이라 확신할 때 사용할 수 있다.

  2. .xcfilelist 파일 확장자의 textfile로 파일 리스트를 제공하는 방법
    파일 리스트는 파일들을 편집하기 용이하고, 특히 리스트가 자주 변경되거나 리스트에 커멘츠를 남기고 싶을 때 유용하다.

Path String은 $(SRCROOT)와 같은 build variable을 사용할 수 있다.

  • $(SRCROOT) : build variable로 프로젝트가 속한 루트 디렉토리를 저장하고 있음

💡 Note
input, output file을 적는 것이 필수는 아니지만, 적는 것을 강력 권장한다. Xcode는 input, output file의 세트를 사용해 필요시에만 스크립트를 실행시킴으로싸 빌드 타임 최적화를 한다. 만약 Input, output file을 적지 않으면 타겟을 빌드할 때마다 스크립트가 실행된다. 더 많은 정보는 Improving the speed of incremental builds를 참고할 것


Script-specific environment variable

그 전에 알아본 것이 environment variable와 shell variable이다.
shell은 두가지 타입의 variable을 갖는다.

environment variable

  • 전역(global) 변수. 한 번 정의되면 모든 shell에서 공유된다.
  • 자식 shell에게 상속된다.
  • env 명령어로 environment variable 리스트를 볼 수 있다.

shell variable

  • 정의된 shell에서만 접근 가능한 변수.
  • 자식 shell에게 상속되지 않는다.
  • export명령어를 사용하면 전역 변수로 사용할 수 있다
FOO=BAR // shell variable 정의
export FOO // environment variable로 정의 됨

변수에 값을 설정할 때는 이렇게

FOO=BAR 

변수의 값을 사용할 때는 변수 앞에 $를 붙인다.

echo $FOO 

다시 돌아와서 Xcode는 각 script를 위한 environment variable을 생성하고, 변수를 통해 script에 관련된 파일에 접근할 수 있다. (아래 그림은 생성하는 변수 리스트)

environment variable이라고 명칭해서 모든 셸에서 접근 가능한 변수인가 헷갈렸는데, 특정 스크립트에 관련된 정보를 제공하므로 해당 스크립트를 실행하는 셸에서만 사용할 수 있는 변수인 것 같다.

또한 빌드 세팅에도 접근 할 수 있다.


Script에서 error나 warning Log 찍기

error나 warning log를 찍는 스크립트를 작성하면 Xcode build log에 메시지를 찍을 수 있다.

echo 명령어를 사용해 아래 포맷과 같이 작성한다.

// message format
[filename]:[linenumber]: error | warning | note : [message]
  • filename : 에러가 특정 파일에서 발생한다면 에러가 발생하는 파일의 절대 경로를 명시
  • linenumber : 에러가 파일의 특정 라인에서 발생한다면 에러가 발생하는 라인의 번호를 명시
// 예시
echo "error: An expected input file was missing."
echo "warning: Skipping a file of an unknown type."

Build failure 유발하기

스크립트가 실패하고 회복할 수 없을 때 nonzero exit code를 리턴하자.
그리고 실패에 대한 적절한 정보도 함께 제공할 수도 있다.

Xcode는 nonzero exit 값을 빌드 실패로 간주한다.

echo "error: A fatal error occurred in the script."
exit 1

위와 같은 코드는 에러 메시지를 빌드 로그에 남기고 빌드를 실패시킨다.


정리

  • Build phase에 add New Run script를 하면 운영체제와 상호작용할 수 있는 shell을 이용해 빌드 타임에 코드를 실행한다. 타겟별로 추가할 수 있기 때문에 타겟 개별 적으로 할 작업을 여기서 실행시킬 수 있다.
  • 스크립트가 처리할 데이터를 input file로, 스크립트가 처리한 데이터를 저장할 output file을 지정할 수 있다.
  • Xcode가 제공하는 environmnet variable로 스크립트에서 관련 파일들과 빌드 세팅에 접근 할 수 있다.
  • 스크립트에 error log를 프린트하는 스크립트를 작성하면 빌드 로그를 찍을 수도 있고, nonzero exit을 통해 빌드 실패를 유발할 수도 있다.

References

위키백과: Shell
#!bin/bash의 의미
Shell과 Environment vs. Shell variables(영어 강의 자료)
Shell Environment에 대해 정리한 블로그

profile
i🍎S 개발을 합니다

1개의 댓글

comment-user-thumbnail
2024년 1월 4일

좋은 글 감사합니다!

답글 달기