Skip to content

Instantly share code, notes, and snippets.

@kanghyojun
Forked from dahlia/README.md
Created July 30, 2018 14:02
Show Gist options
  • Save kanghyojun/54a5ee7cd0445ee6d489c5b10dd79adb to your computer and use it in GitHub Desktop.
Save kanghyojun/54a5ee7cd0445ee6d489c5b10dd79adb to your computer and use it in GitHub Desktop.
니름 스프린트 사전 준비

니름 스프린트 사전 준비

따라하다가 잘 되지 않을 때는 프로젝트 대화방에 오셔서 물어보시면 도와드립니다.

감 잡기

스프린트를 하기 전에, 니름이 어디에 쓰는 소프트웨어인지 감을 잡을 필요는 있겠죠. 개괄적인 소개는 아래 발표 자료를 참고해주세요.

써보기

빌드 환경을 준비하기 전에, 우선 니름을 한번 써보면 좋습니다. 니름 문법이 어떻게 생겼는지 보기 위해 니름 컴파일러 저장소에 들어있는 예제 패키지를 열어봅시다.

각 파일들의 내용은 다음과 같습니다. (꼭 내용을 전부 이해할 필요는 없으니, 어떤 모양인지만 보셔도 됩니다.)

  • package.toml: 니름의 빌드 단위는 한 .nrm 파일이 아니라, 패키지 디렉토리 단위입니다. package.toml은 패키지 디렉토리의 가장 바깥쪽에 위치하며, 해당 패키지 디렉토리를 빌드할 때 사용될 설정을 담습니다. (파이썬 패키지의 setup.py나 자바스크립트 패키지의 package.json 같은 것입니다.)

    이 파일의 자세한 설명은 문서에 써져있으나, 굳이 지금 숙지할 필요는 없습니다.

  • product.nrm: 니름의 가장 기본적인 구조인 레코드(record)와 열거형(enum)을 정의하는 예제입니다. 인터넷 쇼핑몰의 제품과 제품의 가격, 그리고 주문을 담는 시나리오입니다. 또한, 파이썬의 딕셔너리에 해당하는 맵 자료형과, 파이썬 3.5에 추가된 typing.Optional[T]에 해당하는 옵션 자료형을 쓰는 것도 보여줍니다.

  • shapes.nrm: 니름의 좀더 복잡한 구조인 공용체(union)와 언박스드 자료형(unboxed)을 정의하는 예제입니다. 뒷 이름(behind name)을 별도로 정하는 예제도 보여줍니다. 아주 간단한 기하학의 거리와 점, 도형을 니름으로 정의합니다.

  • address.nrm: 니름 패키지 내에서 다른 모듈에 정의된 자료형을 임포트하는 예제입니다. 주소지와 좌표를 담는 자료형을 정의합니다.

  • countries.nrm: 위 address.nrm 예제에서 사용할 ISO 3166-1 코드를 열거형으로 정의하는 예제입니다.

  • builtins.nrm: 니름에 내장된 기본 자료형을 소개합니다.

  • pdf-service.nrm: 실제 서로 통신하는 서비스를 만들 때 필요한 인터페이스를 정의하는 예제입니다. 서비스에서 제공하는 메서드들을 나열하고, 각 메서드가 받는 인자와 결과의 자료형, 그리고 오류가 날 경우 오류의 자료형을 정의하는 것을 보여줍니다. 웹 문서의 URI나 HTML 문자열, 또는 마크다운 텍스트를 렌더링한 PDF를 바이너리로 돌려주는 가상의 서비스 시나리오입니다.

이 예제를 직접 빌드해봅시다. 우선 최신의 실행 바이너리를 다운로드합니다. 이하의 예에서는 해당 실행 바이너리를 적당히 PATH 경로에 위치시키고, 이름은 nirum.exe 또는 nirum으로 바꿨다고 가정합니다. (물론 리눅스나 맥에서는 실행 권한도 줘야 합니다.)

먼저 예제가 들어있는 소스 코드를 받습니다.

git clone git://github.com/nirum-lang/nirum.git
cd nirum/

그 뒤 아래 명령으로 examples/ 디렉토리에 들어있는 예제 니름 패키지를 파이썬으로 컴파일합니다.

nirum -t python -o out/ examples/

nirum 명령의 각 옵션은 다음과 같습니다.

  • -t/--target: 어떤 언어의 소스 코드로 컴파일할지를 결정합니다. 현재는 파이썬(python)과 HTML 문서(docs)만 지원합니다. (현재 타입스크립트 작업이 진행중입니다.)

  • -o/--output-dir: 컴파일된 결과 코드가 저장될 디렉토리의 경로입니다. 해당 경로에 디렉토리가 없으면 알아서 생성합니다.

  • 마지막의 인자는 컴파일할 니름 소스 코드가 들어있는 패키지 디렉토리의 경로입니다. package.toml 파일이 들어있는 디렉토리여야 합니다.

따라서 위 명령을 실행하면 out/ 디렉토리가 생기고 그 안에 파이썬 소스 코드들이 생성됩니다. 생성된 파이썬 패키지를 시범 사용해보기 위해, 임시 가상 환경을 만들어서 설치해봅시다.

python3 -m venv tmpenv
. tmpenv/bin/activate  # 윈도(cmd.exe)의 경우에는 tmpenv\bin\activate
                       # 윈도(파워셸)의 경우에는 tmpenv\bin\activate.ps1
pip3 install -e out/

설치됐으면 python3 명령으로 파이썬 대화형 셸을 실행해서 설치된 패키지를 임포트하여 써볼 수 있습니다.

>>> from shapes import *
>>> r = Rectangle(upper_left=Point(left=Offset(5.), top=Offset(10.)),
...               lower_right=Point(left=Offset(20.), top=Offset(30.)))
>>> isinstance(r, Shape)
True
>>> isinstance(r, Rectangle)
True
>>> isinstance(r, Circle)
False
>>> r.__nirum_serialize__()
{'_tag': 'rectangle',
 '_type': 'shape',
 'lower_right': {'_type': 'point', 'top': 30.0, 'x': 20.0},
 'upper_left': {'_type': 'point', 'top': 10.0, 'x': 5.0}}

하스켈 개발 환경 준비

하스켈 스택은 하스켈을 위한 패키지 매니저 겸 개발 환경 관리 도구입니다. 하스켈은 빌드 및 배포 면에서 파이썬과 특성이 많이 다르기 때문에, 하스켈 스택이 파이썬의 어떤 도구에 해당되는지는 1:1로 비교해서 설명하기 힘듭니다. 어쨌든 하스켈 스택은 다음과 같은 일들을 도와줍니다.

  • 프로젝트에 필요한 버전의 하스켈 컴파일러(GHC)가 아직 시스템에 설치되어 있지 않다면, 알아서 받아서 설치해줍니다.

  • 서로 다른 하스켈 프로젝트끼리 다른 컴파일러나 다른 라이브러리에 의존하더라도 섞이지 않도록 프로젝트별로 개발 환경을 격리해줍니다.

  • 프로젝트에서 의존하는 라이브러리들을 받아서 설치해줍니다.

  • 프로젝트의 단위 테스트를 실행해줍니다.

  • 프로젝트를 빌드하여 네이티브 실행 바이너리 파일을 만들어줍니다.

짧게 요약하면, 하스켈 개발 환경 준비는 하스켈 스택을 설치하는 것으로 끝납니다.

하스켈 스택의 설치 설명서를 따라하면 복잡하지 않게 설치할 수 있습니다.

성공적으로 설치됐다면, stack 명령어를 쓸 수 있습니다.

stack --version

혹시 이전에 하스켈 스택을 설치한 적이 있지만, 그 이후 오랫동안 사용하지 않았다면, 최신 버전으로 업그레이드해주세요. stack upgrade 명령으로 업그레이드할 수 있습니다.

니름 컴파일러 빌드해보기

이 부분은 미리 해오시면 좋지만, 잘 되지 않는다면 스프린트 당일에 진행자가 도와드릴 수 있습니다.

앞서 예제를 위해 받아둔 소스 코드의 디렉토리로 이동한 뒤, 다음 명령어로 니름 프로젝트에 필요한 버전의 하스켈 컴파일러(GHC)를 설치합니다.

stack setup

컴파일러가 준비됐다면 아래 명령을 통해 테스트를 실행해봅시다.

stack test

아래 명령어를 통해 니름 실행 바이너리를 만들 수 있습니다.

stack build

실행 바이너리 빌드가 성공적으로 끝났다면, 아래 명령어로 빌드된 실행 바이너리를 써볼 수 있습니다.

stack exec -- nirum -t python -o out/ examples/

stack exec는 해당 프로젝트에서 빌드한 실행 바이너리를 하스켈 스택이 대신 실행시켜주는 명령어입니다. (위 예시에서 --는 그 이후의 옵션이 stack exec의 옵션이 아닌, nirum 실행 바이너리의 자체적인 옵션이라는 표시입니다.)

컴파일러로 예제 코드를 빌드하는데 성공하셨다면, 튜토리얼을 읽으면서 니름 패키지를 작성하고 간단한 마이크로서비스를 작성해보세요. 더 자세하게 니름의 기능에 대하여 읽고 싶으시다면, 문서들을 읽어보시고 오셔도 좋습니다.

이슈 선정하기

니름 이슈 트래커에서는 이슈의 난이도에 따라 이슈를 분류해 두었습니다. 비교적 쉬운 과업을 찾아 빠르게 니름에 기여할 수도 있고, 도전적인 과업을 해결해 유용한 기능을 만들 수 있습니다.

PR 올리기

니름의 모든 풀 리퀘스트들은 다음의 테스트를 통과해야합니다.

  • 린트: 일관된 코드 스타일을 유지하고, 간결한 코드를 작성하기 위해 hlint로 검사합니다.
  • 단위 테스트와 통합 테스트: 코드 변경으로 인한 부수 효과가 없는지 확인하고 견고한 코드를 작성하기 위해 테스트를 작성합니다. 모든 기능 추가와 버그 해결은 알맞은 단위 테스트와 통합 테스트가 같이 작성되어야 합니다.
  • 체인지로그: 기능이 추가되거나 변경되었을 때 사용자가 이를 쉽게 알 수 있어야 합니다. 그래서 모든 풀 리퀘스트는 체인지로그를 갖도록 검사하고 있습니다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment