DeepintoPharo:Chapter 02

From 흡혈양파의 번역工房
Jump to: navigation, search
제 2 장 zero 설정 스크립트와 명령행 핸들러

zero 설정 스크립트와 명령행 핸들러

Camillo Bruni 참여 (camilobruni@gmail.com)


단일 명령행으로부터 Pharo를 설치하거나 명령행으로 인자를 전달할 수 없다는 사실에 신물난 적이 없는가? 훌륭한 디버거와 대화형 환경 개발을 이용한다고 해서 Pharo 개발자들이 자동 스크립트를 중요하게 생각하지 않고 명령행을 사랑한다는 의미는 아니다. 우리도 물론 그것을 중요하게 생각하며, 두 가지 모두에게 최선을 원한다! 우린 임의의 정보를 유지해야 한다는 생각에서 자유롭길 원했다. zero 설정은 당신이 시작하는 데에 필요한 모든 것을 자동으로 다운로드하는 스크립트다. Pharo 2.0 이상 버전부터는 명령행 인자를 정의하고 처리하는 방식 또한 지원하고 있다.


본 장에서는 명령행으로부터 환경으로 인자를 전달하는 방법 뿐만 아니라 Pharo를 위한 zeroconf 스크립트를 얻는 방법도 제시하고자 한다.


VM과 Image 얻기

최신 2.0 Pharo 이미지와 vm을 다운로드하기에 앞서 zero 설정을 다운로드 하는 방법은 다음과 같다.

wget get.pharo.org/20+vm


wget가 설치되어 있지 않다면 curl -L 을 대신 사용해도 좋다.


방금 다운로드한 스크립트를 실행하기 위해서는 chmod a+x 를 이용해 권한을 변경하거나 아래와 같이 bash를 통해 호출하는 방법을 택해야 한다.


설정하기. 이용 가능한 설정의 종류는 어마어마하다. 각 스크립트에 대한 URL은 다음 표현식에 따라 vm과 이미지 버전으로부터 쉽게 빌드가 가능하다: get.pharo.org/$IMAGE_$VM

$IMAGE에 가능한 값은 다음과 같다: 12 13 14 20 30 stable alpha
$VM에 가능한 값은 다음과 같다: vm vmS vmLatest vmSLatest


물론 get.pharo.org/$IMAGE 에서 이미지를 다운로드하거나 get.pharo.org/$VM에서 VM을 다운로드할 수도 있다.


help 살펴보기. 스크립트 도움말(help)을 살펴보자.

bash 20+vm --help


help를 살펴보면 20+vm 명령이 현재 가상 머신을 다운로드하여 pharo-vm 폴더로 넣는다고 말하고 있다. 또한 몇 가지 스크립트를 생성한다: 시스템을 시작하기 위한 pharo, 이미지를 UI 모드에서 시작하기 위한 스크립트인 pharo-ui. 마지막으로 최신 이미지를 다운로드하고 파일을 변경하기도 한다.


This script downloads the latest Pharo 20 Image.
This script downloads the latest Pharo VM.

The following artifacts are created:
  Pharo.changes A changes file for the Pharo Image
  Pharo.image A Pharo image, to be opened with the Pharo VM
  pharo Script to run the downloaded VM in headless mode
  pharo-ui Script to run the downloaded VM in UI mode
  pharo-vm/ Directory containing the VM


잡고(grab) 실행하기. 접 스크립트를 실행하길 원한다면 아래를 실행할 수도 있다.

wget -O - get.pharo.org/20+vm | bash


옵션 - O - 는 다운로드된 bash 파일을 standard out으로 출력할 것이므로 이를 bash로 pipe할 수 있다. 웹의 로그가 마음에 들지 않을 시 --quiet를 사용하라.

wget --quiet -O - get.pharo.org/20+vm | bash


자동화 업무를 신뢰하는 사람들은 참고하시오. 스크립트는 우리 Jenkins 서버 ( https://ci.inria.fr/pharo/job/Scripts-download/ )와 gitorious 서버( https://gitorious.org/pharo-build/pharo-build )로부터 자동으로 인출된다. 그렇다. 우리는 에너지를 아껴주는 자동화 업무를 신뢰한다.


VM만 얻기

당신은 다른 스크립트도 사용할 수 있다. 가령 get.pharo.org/vm은 최신 vm만 다운로드한다.

wget -O - get.pharo.org/vm | bash


다시 말하지만 어떤 스크립트와 마찬가지로 help 메시지를 언제든 확인할 수 있다.


해당 스크립트는 최신 Pharo VM을 다운로드한다.

다음 결과물이 생성된다:

pharo 다운로드된 VM을 headless 모드로 실행시킬 스크립트
pharo-ui 다운로드된 VM을 UI 모드로 실행시킬 스크립트
pharo-vm/ VM을 포함하는 디렉터리


그림 2.1은 http://get.pharo.org에서 받을 수 있는 스크립트 목록을 보여준다.


명령행 옵션 처리하기

이제 명령행 인자를 처리하는 새롭고도 훌륭한 방법이 생겼다. 이는 자체 문서화되고 쉽게 확장 가능하다. 명령행이 어떻게 처리되는지 살펴보자. 앞과 마찬가지로 결과에 도달하는 과정을 보여주면서 시작하겠다.

결과에 도달하기

앞에서 언급했다시피 자체 문서화를 좋아하고 중요하게 생각하므로 설명을 얻기 위해 --help 옵션을 사용하라.

./pharo Pharo.image --help


이는 아래와 같은 출력을 생성할 것이다.

Usage: [<subcommand>] [--help] [--copyright] [--version] [--list]
  --help print this help message
  --copyright print the copyrights
  --version print the version for the image and the vm
  --list list a description of all active command line handlers
  <subcommand> a valid subcommand in --list


Documentation:
A DefaultCommandLineHandler handles default command line arguments and options.
The DefaultCommandLineHandler is activated before all other handlers.
It first checks if another handler is available. If so it will activate the found handler.

그림 2.1: 모든 스크립트는 http://get.pharo.org 에서 이용 가능하다.


시스템 버전과 핸들러 목록

기본 옵션 중 두 가지가 중요한데, 바로 versions와 list다. 이를 먼저 살펴보도록 하자.


시스템 버전 얻기. 일반적이면서 중요한 명령행 옵션은 --version이다. 버그와 이상(deviant) 행위를 전달할 때 이용하길 바란다.

./pharo Pharo.image --version
M: NBCoInterpreter NativeBoost-CogPlugin-IgorStasenko.15 uuid: 44b6b681-38f1-4a9e-  b6ee-8769b499576a Dec 18 2012
NBCogit NativeBoost-CogPlugin-IgorStasenko.15 uuid: 44b6b681-38f1-4a9e-b6ee-8769b499576a Dec 18 2012
git://gitorious.org/cogvm/blessed.git Commit: 452863bdfba2ba0b188e7b172e9bc597a2caa928 Date: 2012-12-07 16:49:46 +0100 By:Esteban Lorenzano <estebanlm@gmail.com> Jenkins build #5922

--version 인자는 가상 머신의 버전을 제공한다. 이미지의 버전을 얻고자 한다면 이미지를 열고 World 메뉴를 이용해 About을 선택하면 된다.


이용 가능한 핸들러의 목록. 명령행 옵션 --list 는 현재 옵션 핸들러의 목록을 제공한다는 면에서 흥미롭다. 목록은 현재 시스템에 로딩된 핸들러에 따라 좌우된다. 특히 자신의 상황이나 바람에 맞게 핸들러를 단순히 추가할 수 있음을 의미한다.


아래 목록은 우리가 본 장을 작성할 당시 사용한 시스템에서 이용 가능하다.

./pharo Pharo.image --list

Currently installed Command Line Handlers:
  st      Loads and executes .st source files
  Fuel    Loads fuel files
  config  Install and inspect Metacello Configurations from the command line
  save    Rename the image and changes file
  test    A command line test runner
  update  Load updates
  printVersion Print image version
  eval    Directly evaluates passed in one line scripts


이제 특정 옵션을 어떻게 사용해야 하는지 궁금할 것이다. 사실 Metacello configurations의 로딩을 처리하는 config 옵션을 이용하는 것이 분명해 보이지 않는다. 하지만 짐작하였듯 핸들러 또한 자체 설명적이다. 한 번 살펴보도록 하자.


Metacello Configuration 로딩하기. Config 옵션의 사용에 관한 설명을 가져오기 위해서는 아래와 같이 연관된 도움말(help)을 요청하면 된다:

./pharo Pharo.image config --help


이러한 도움말은 명령행 일반적인 시스템에 해당하지 않고 관련 핸들러 중 하나에 해당한다.

Usage: config [--help] <repository url> [<configuration>] [--install[=<version>]] [--group=<group>] [--username=<username>] [--password=<password>]
--help              show this help message
  <repository url>    A Monticello repository name
  <configuration>     A valid Metacello Configuration name
  <version>           A valid version for the given configuration
  <group>             A valid Metacello group name
  <username>          An optional username to access the configuration's repository
  <password>          An optional password to access the configuration's repository


Examples:
  # display this help message
  pharo Pharo.image config

  # list all configurations of a repository
  pharo Pharo.image config $MC_REPOS_URL

  # list all the available versions of a confgurtation
  pharo Pharo.image config $MC_REPOS_URL ConfigurationOfFoo

  # install the stable version
  pharo Pharo.image config $MC_REPOS_URL ConfigurationOfFoo --install

  #install a specific version '1.5'
  pharo Pharo.image config $MC_REPOS_URL ConfigurationOfFoo --install=1.5

  #install a specific version '1.5' and only a specific group 'Tests'
  pharo Pharo.image config $MC_REPOS_URL ConfigurationOfFoo --install=1.5 --group=Tests


핸들러의 구조

앞에서 언급하였듯 명령행 메커니즘은 개방형이고 확장이 가능하다. 이제 eval(평가) 옵션에 대한 핸들러가 어떻게 정의되는지 살펴볼 것이다.


Pharo 표현식 평가하기. 아래와 같이 명령행을 이용해 표현식을 평가할 수도 있다:

./pharo Pharo.image eval '1+2'
./pharo Pharo.image eval --help

Usage: eval [--help] <smalltalk expression>
  --help list this help message
  <smallltalk expression> a valid Smalltalk expression which is evaluated and
                the result is printed on stdout
                
Documentation:
A CommandLineHandler that reads a string from the command line, outputs the
        evaluated result and quits the image.

This handler either evaluates the arguments passed to the image:
  $PHARO_VM my.image eval 1 + 2

or it can read directly from stdin:

  echo "1+2" | $PHARO_VM my.image eval


이제 다음과 같이 핸들러가 정의된다: 먼저 우리가 CommandLineHandler의 서브클래스를 정의한다. 여기서 BasicCodeLoader는 CommandLineHandler의 서브클래스이고, EvaluateCommandLineHandler 는 BasicCodeLoader 의 서브클래스이다.

BasicCodeLoader subclass: #EvaluateCommandLineHandler
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'System-CommandLine'


다음으로 클래스 측면에서 commandName을 정의하고 메서드 isResponsibleFor: 도 함께 정의한다:

EvaluateCommandLineHandler class>>commandName
    ^ 'eval'

EvaluateCommandLineHandler class>>isResponsibleFor: commandLineArguments
    "directly handle top-level -e and --evaluate options"
    commandLineArguments withFirstArgument: [ :arg|
        (#('-e' '--evaluate') includes: arg)
            ifTrue: [ ^ true ]].

    ^ commandLineArguments includesSubCommand: self commandName

EvaluateCommandLineHandler class>>description
    ^ 'Directly evaluates passed in one line scripts'


이제 옵션이 일치하면 실행될 activate 메서드를 정의한다.

EvaluateCommandLineHandler>>activate
    self activateHelp.
    self arguments ifEmpty: [ ^ self evaluateStdIn ].
    self evaluateArguments.
    self quit.


특히 우리는 클래스 주석을 정의하는데, help를 요청 시 인쇄되는 것이 클래스 주석이기 때문이다.

평가 스크립트의 끝에 이미지가 저장되길 원한다면 --save 옵션을 eval 직후에 전달하라.


Jenkins와 함께 ZeroConf 스크립트 이용하기

우리에겐 그러한 스크립트가 있고 옵션을 명시할 가능성이 있으므로 가능한 한 bash에 적게 의존하는 Jenkins 스크립트를 작성할 수 있겠다.


예를 들어, 프로젝트 XMLWriter(PharoExtras에 host하는)에 대해 jenkins에서 사용하는 명령은 다음과 같다.

# jenkins puts all the params after a / in the job name as well :(
export JOB_NAME=`dirname $JOB_NAME`

wget --quiet -O - get.pharo.org/$PHARO+$VM | bash

./pharo Pharo.image save $JOB_NAME --delete-old
./pharo $JOB_NAME.image --version > version.txt

REPO=http://smalltalkhub.com/mc/PharoExtras/$JOB_NAME/main
./pharo $JOB_NAME.image config $REPO ConfigurationOf$JOB_NAME --install=$VERSION --group='Tests'
./pharo $JOB_NAME.image test --junit-xml-output "XML-Writer-.*"

zip -r $JOB_NAME.zip $JOB_NAME.image $JOB_NAME.changes


요약

이제 쉽게 Pharo의 최신 버전에 접근하고 스크립트를 빌드할 수 있게 되었다. 뿐만 아니라 명령행 핸들러는 셸 스크립트에서 사용될 새로운 지평을 연다.


Notes