PackageMaker와 Script 그리고 relocation 세팅

PackageMaker는 여러가지 헷갈린 세팅이 있고, 뭔가 잘못되었을때 왜 잘못되었는지를 파악하기가 참 힘들다.

인스톨러가 제대로 동작하는지 확인할때, 그 여부를 확인하기 힘든 경우 중 하나가 relocation이 가능하도록 세팅을 할때이다.
이 relocation은 일단 설치가 된 파일을 사용자가 옮겨도, 그 옮겨진 위치를 찾아내서 다음번 업데이트시나 인스톨시에 그 옮겨진 위치에 있는 것을 업그레이드하게 해준다. 그러므로 상당히 강력한 기능이긴 한데, 문제가 있다. 즉 개발자의 build 디렉토리에 있는 것까지 찾아낸다. 그러므로 프로그래머가 자기의 머신에서 인스톨을 해보면, 원래 의도한 디렉토리에 설치를 하는 것이 아니라, 자기가 빌드한 빌드 디렉토리의 것을 업데이트 한다. 그러면 도대체 설치가 되었는지 아닌지 알아보기가 힘들다. 물론 인스톨 로그를 살펴보면 알아 낼수는 있지만, 쉽게 눈에 띄지를 않는다.

두번째 문제는 스크립트에 관련한 것이다. 단순히 설치를 하는 것이 아닌, 뭔가 설치를 하기 전이나 후에 하려면, 스크립트를 사용하게 마련이다.
PackageMaker는 Product setting으로는 Automator를 이용해서 할 수있게 해 놨고, component setting으로는 일반 shell script를 이용할 수있게 해 놓았다.
그러므로 product setting에서는 AppleScript도 바로 사용할 수가 있다.

그런데 여기서 좀 문제가 생긴다. 아시다시피 Snow Leopard는 이제 거의 PPC에서 Intel로의 완전한 이동을 의미하는 OS이다. 더군다나 이미 64bit로 제한 없는 프로그래밍을 가능하게 해 놓았지만, 아직 User들을 고려해서 부팅 자체는 32비트로 하는 것을 기본으로 하고있다. 이런 상황에서 사용자들은 Rosseta와 같은 PPC emulator를 더 이상 설치하지 않는 경우가 왕왕 있다.
바로 엊그제 벌어진 일인데, AppleScript 에디터인 Script Editor에서 스크립트 파일을 Application 형식으로 저장하면 여전히 PPC로 저장이 된다. (Leopard에서)
그리고 .app이라는 확장자를 부여하지만 Bundle의 형태는 아니고 단일한 binary이다. 이게 Rosetta가 설치되지 않은 Mac에서 사용하려고 하면 문제를 일으킨다. 그렇지 않겠는가? PPC로 된 것을 Intel 프로세서에서 돌리려고 하니…
그래서 어떻게 하면 Universal Binary로 만들 수있을까 해서 osacompile의 MAN 페이지를 봤더니 type에 대한 게 제대로 명시가 되어 있지를 않은거다. 참 난감하다 이럴땐.. 도대체 무슨 생각으로들 MAN 페이지를 만드는 건지.
그래서 그냥 Script Editor에서 Application Bundle형식으로 저장했다. 그러면 비로서 Universal Binary의 형태로 나오게 된다. 문제는 이 Bundle형식으로 된 것을 product setting에서 설치 후에 호출되게 세팅을 하면, 되지를 않는 것이다. Application형식은 되는데 말이지.
자.. 이게 문제 하나였고..

이제 문제 둘…
그렇다면 component setting에서 shell script를 이용해서 하는 방법이 있겠다.
우선 AppleScript 스크립트를 스크립트 형식(*.scpt)로 저장하고, 이 놈을 설치하도록 한다. 내 경우는 이것이 제일 마지막에 인스톨 되도록 목록에서 제일 밑에 놓았다. 그리고 이 파일의 스크립트 탭에서 Script 세팅을 해서, post-install과 post-upgrade시에 내 shell script가 동작하도록 해 놓았다.
아… 여기서 한마디. PackageMaker의 설명서에는 나와 있지 않은데, script 세팅을 통해서 설정하는 쉘 스크립트는 굳이 인스톨되는 하나의 컴포넌트로 하지 않아도 된다. PackageMaker가 알아서 압축해서 인스톨러 번들에 잘 넣어 놓는다.
아무튼.. 혹은 post-flight에만 세팅해도 된다. 왜냐하면 어떤 상황이던 post-flight가 최종적으로 수행되는 단계이기 때문이다.
단 이 설명은 10.4 Tiger까지의 이야기다 10.5 Leopard때부터는 post-install하나밖에 없다.
아마 AppleScript 파일은 수행후에 없어질 것이므로, shell script에서 해당 파일을 지우도록 한다.
대충 보자면 다음과 같다.

#!/bin/sh

pathToScript=/Applications/Add_Login_Item_test.scpt

echo "Trying to add login item..."

echo $pathToScript

/usr/bin/osascript $pathToScript

echo "Added to login item..."

echo "Removing Add_Login_Item.scpt"

rm $pathToScript 

이 스크립트는 예에서 Add_Login_Item_test.scpt를 설치하고서 거기에 대해서 세팅된 것이므로 pathToScript를 굳이 저렇게 하드 코딩하지 않고도 $1으로 해주면 사실 된다. 근데 문제는 이너므 PackageMaker다. 분명히 relocatable하게 하지 않았는데도, $1을 통해서 들어오는 AppleScript 파일의 패스가 때로는 패키지 내의 것으로 되는 경우가 있다. 분명히 인스톨 된 후에, 인스톨된 위치의 것이어야 하는데도 말이지. 이게 때때로 되기도 하고 안되기도 하고.. 나 원참…
그래서 아예 하드 코드들 해버린 것이다.

또 하나의 문제점. pathToScript로 저장된 path에 white space가 있는 경우이다.
Google에 찾아보면 다음과 같이들 많이 되어 있다.

'/usr/bin/osascript "$pathToScript"'

근데 이렇게 하면 안된다. 이상하지..
혹은 single quote와 double quote 위치를 바꿔보자.. 혹시나 해서..
역시나 안된다.
원래대로라면 되어야 한다. 뭔가 문제가 있는 것일까? 아니면 내가 뭘 착각하고 있는 것일까? 예전엔 되었던거 같은데..
아무튼 Leopard에서 해보면 어떤 quote를 쓰던 간에 $variable을 그 안에 담긴 내용으로 expansion하지 않고, 글자 그대로 $variable로 해석해 버린다.
이거 참…

거의 모든 매킨토시용 프로그래머들이 인스톨러를 사용하지 않는다. 극히 제한적인 경우를 빼곤 말이다. Tiger때와 바로 Leopard로 올라오면서 PackageMaker에 버그가 워낙에 많아서 그때 참 리포트를 많이 했다. 그러고 나서 업데이트 된게 3.0.3버젼이었나 3.0.2버젼이었나 그런데… 아무튼 내가 리포트한 문제가 많이 해결은 되었는데, 여전히 자잘하게 많은 문제가 있다. 아무래도 사용하는 사람들이 그다지 많이 없으니 안되는 것이리라 생각하지만.. 아무래도 이건 영 Apple 스럽지 못한 프로그램이다. 일전엔 여러 컴포넌트를 설치하는 경우에 만들어지는 JavaScript 코드에 문제가 있는 경우를 봤다. 그때 mailing list에 있는 어떤 분이 알려주셔서 쳐다보았는데.. 우와.. 정말 문제였다.

Mac은 그다지 인스톨러들이 필요하지 않다. Windows처럼 바이너리 파일들이 여러개 파일로 지저분하게 널부러져 있지 않기 때문이다. 그리고 Program Files처럼 깊이 깊이 프로그램들이 들어가있지도 않기 때문이다. 하지만 사용자들이 인스톨러를 원하는 경우가 있다. 그럴 경우엔 어쩌랴.. D&D로도 쉽게 되는데, 굳이 인스톨러를 요구하니.. 대개 윈도우즈 사용자들이 맥을 사용하면서 이런 요구를 하는데… 참… 뭐라고 하기에도 그렇고…

암튼 PackageMaker에 대한 대충의 문제와 해결점을 요약하자면 이상과 같았다.

2 responses to this post.

  1. JongAm님. 오랜만입니다. 한민석입니다.

    처음으로 인스톨러에 쓰기 위해 패키지메이커를 쓰는데 스크립트 때문에 거의 12시간 동안 헤매고 있었습니다. 다행히도 이 포스트를 보고 방금 해결했습니다. 정말 힘들었네요. 왜 패키지로 어플을 배포하는 개발자들이 애플 자체 외에는 별로 없는지 깨달을 만한 경험이었습니다.

    구글 검색 결과를 다 봐도 해답이 확실하지 않았는데, 도움이 많이 되었습니다. 감사합니다.

    Reply

    • Posted by jongampark on January 10, 2010 at 8:11 PM

      새해 복많이 받으세요. 인사가 늦었네요.

      네.. 패키지메이커가 참 문제가 많아요. 문서화도 제대로 안되어 있고, 된 것마저도 헷갈리게 되어 있고..
      그냥 이리 저리 시도해 보면서 어떻게 동작하는 것인지를 파악하는 수밖에 없죠.
      저도 인스톨러 만들기 위해서만 며칠씩 허비하기도 했어요.

      도움이 되셨다니 저도 기분이 좋네요.
      좋은 하루 되세요.

      Reply

Leave a comment