2009-11-04 3 views
7

저는 Apple Framework 프로그래밍 가이드 >>Installing your framework의 조언에 따라/Library/Frameworks에 설치하는 사용자 정의 프레임 워크를 사용하고 있습니다. 나는 실행 스크립트를 추가하여이 작업을 수행 할 다음 스크립트와 빌드 단계 :맞춤형 코코아 프레임 워크를 설치하는 가장 좋은 방법

#import <MyFramework/MyFramework.h> 
: 다음과 같이 내 수업에/라이브러리/프레임 워크/MyFramework에 연결하고 가져 내 프로젝트에서

cp -R build/Debug/MyFramework.framework /Library/Frameworks 

을 이 적용됩니다 -로드 - 규칙 sharedlibrary 모든,691을 ... 디버거에

로드 프로그램 :

이것은 내가 항상 내 디버거 콘솔에 다음과 같은 메시지를 볼 것을 제외하고, 아주 잘 작동경고 : "/Users/elisevanlooij/Library/Frameworks/MyFramework.framework/Versions/A/MyFramework"(파일을 찾을 수 없음)에 대한 기호를 읽을 수 없습니다. 경고 : "MyFramework"의 기호를 읽을 수 없습니다 (아직 메모리에 매핑되지 않음). 프로그램이로드되었습니다.

분명히, 컴파일러는 먼저/라이브러리/프레임 워크에, MyFramework을 찾을 않는 외모와 메리 길에 계속에서/사용자/elisevanlooij/라이브러리/프레임 워크, MyFramework를 찾을 수 없습니다 보인다. 지금까지는 실제 문제보다는 성가심이 많았지 만 단위 테스트를 실행할 때 gdb는 (파일을 찾을 수 없음)에서 멈추고 계속하기를 거부합니다. 나는 스크립트 실행 단계

cp -R build/Debug/MyFramework.framework ~/Library/Frameworks 

에 여분의 줄을 추가하여 문제를 해결했지만 그것은 처음부터 파손되지 않아야 sello - 테이핑 뭔가 것 같은 느낌이 든다. 이 문제를 어떻게 해결할 수 있습니까?

답변

11

지난 몇 개월 동안 프레임 워크에 대해 많은 것을 배웠으므로이 답변을 다시 작성하고 있습니다. 제가 개발 워크 플로우의 일부로 프레임 워크를 설치하는 것에 대해 을 말하는 것에 유의하십시오.

공개 프레임 워크 (즉, 둘 이상의 응용 프로그램 또는 번들에서 사용할 프레임 워크)를 설치할 때 가장 적합한 위치는/Library/Frameworks [링크 텍스트]입니다. "이 위치의 프레임 워크는 컴파일러에서의 컴파일러와 런타임에서의 동적 링커 "[Framework Programming Guide]. 이렇게하는 가장 우아한 방법은 빌드 설정의 배포 섹션에 있습니다.

프레임 워크에서 작업 할 때 프레임 워크를 업데이트 할 때 프레임 워크를 업데이트 할 때와 그렇지 않을 때가 있습니다. 따라서 릴리스 구성에서만 배포 설정을 변경합니다. 따라서 :

  1. 프레임 워크 대상을 두 번 클릭하여 대상 정보 창을 표시하고 작성 탭으로 전환하십시오.
  2. 구성 선택 상자에서 릴리스를 선택하십시오. 아래로 배포 섹션에
  3. 스크롤하여 다음 값을 입력 :

배포 위치 = YES (클릭 체크 박스)

설치 빌드 제품 위치 =/

설치 디렉토리 =/라이브러리/프레임 워크

설치 빌드 제품 위치는 설치 루트. 기본값은/tmp 디렉토리입니다. 시스템 루트로 변경하지 않으면/tmp에 숨겨져 있기 때문에 설치된 프레임 워크를 볼 수 없습니다.

이제는 다른 프로젝트를 뒤엎지 않고 디버그 구성에서 원하는대로 프레임 워크에서 작업 할 수 있습니다. 게시 할 준비가되었을 때 릴리스로 전환하고 빌드를 수행하면됩니다.

Xcode 4 경고 Xcode 4로 전환 한 이후로 저는 사용자 정의 프레임 워크에서 여러 가지 문제점을 경험했습니다. 대부분, GDB에서 내장 된 단위 테스트를 실행할 때를 제외하고는 프레임 워크의 유용성을 실제로 방해하지 않는 경고를 링크합니다. 나는 일주일 전에 애플에 기술 지원 티켓을 제출했는데, 그들은 여전히 ​​그것을 조사하고있다. 문제가 상당히 대중적으로 입증 되었기 때문에 (1 kViews and counting)이 답변을 업데이트 할 예정입니다.

+0

Xcode 빌드 시스템에 관한 cdespinosa의 답변을 신뢰할만한 것으로 간주해야합니다. – NSResponder

+1

글쎄, 나는 그의 대답을 표결했다. 그래서 나는 내 무릎이 안전하기를 바란다. 하지만 기본 Xcode 설정을 변경하지 않고 명령 줄이 필요 없기 때문에 도착한 솔루션을 좀 더 우아하게 생각해 봅니다. –

0

당연히 프레임 워크를 배포 할 때/Library/Frameworks에 설치해야합니다. 그러나 당신이 프레임 워크의 테스트/디버그 버전으로 그렇게하고 있다는 것은 이상한 것처럼 보입니다.

내 첫 번째 본능은 ~/Library 아래에 테스트 버전을 설치하는 것입니다. 테스트 및 디버그 환경을 훨씬 간단하게 설정하기 때문입니다. 가능하다면 테스트중인 버전의 빌드 트리에 디버그/테스트 프레임 워크가 있어야합니다.이 경우 테스트 목적으로 Private Framework으로 설치됩니다. 여러 버전의 프레임 워크를 다룰 때가되면 훨씬 간단 해집니다.

궁극적으로 응용 프로그램 또는 테스트 슈트가 올바른 버전을로드하는 한 프레임 워크의 위치는 중요하지 않습니다. 테스트/디버깅/개발을 가장 쉽게 할 수있는 위치를 선택하십시오.

+0

프레임 워크는 여러 프로젝트에서 사용되므로 프레임 워크를 사설 프레임 워크로 설치하는 것은 적합하지 않습니다. 릴리스 버전 (cp -R build/Release/MyFramework.framework/Library/Frameworks)에서도 동일한 결과를 얻었지만 그 결과는 같습니다. 프레임 워크가있는 곳은 어디 까지나 ... - 글쎄, 단어가 틀립니다. –

3

프레임 워크를 라이브러리/프레임 워크에 넣을 이유가별로 없으며 많은 작업이 필요합니다. 설치 및 패키지 작성에 많은 번거 로움이 따르는 설치 프로그램 패키지의 사용자를 위해이 작업을 수행해야합니다./L/F에 설치할 수있는 앱에 설치 코드가 있어야합니다 (루트 파워로/L/F에 앱을 설치할 수 있도록 필요한 시간과 노력을 들여야 만하지 않는 한 ~/L/F에만 설치할 수 있습니다).

훨씬 더 일반적인 것은 what Apple calls a “private framework”입니다. 이것을 응용 프로그램 번들에 묶을 것입니다.

라이브러리 (예 : Sparkle, Growl)의 프레임 워크 단일 복사본을 설치하는 "올바른"방식으로 인해 실제로 모든 응용 프로그램 (예 : Sparkle, Growl)에서 일반적으로 사용하기위한 프레임 워크는 개인 프레임 워크로 사용되도록 제작되었습니다./Frameworks 같은 번거 로움입니다.

+0

저는 설치 프로그램 패키지를 만드는 것이 많은 일이라는 것을 의심하지 않습니다. 나는 그것을 해 본 적이 없으며, 내가 기대했던 것이 아닙니다. 그러나 어쨌든 애플 리케이션을 위해 수행되어야 할 것이기 때문에, 프레임 워크를 위해 하나 더 추가하는 것이 그렇게 큰 일임을 알 수 없다. 어쨌든 어쨌든 앱 설치 프로그램에 번들되어야한다. 드문 인기 프레임 워크. 결국 프레임 워크를 비공개로 유지하는 것이 중요하다는 것을 확신하지 못합니다. –

+0

나는 동의하지 않는다. .framework 번들을/Library/Frameworks에 복사 한 다음 다른 Xcode 프로젝트로 가져 오는 것은 정말 쉽습니다. –

+0

@RaffiKhatchadourian :하지만 다른 사람에게는 응용 프로그램이 작동하지 않습니다. 모든 사용자의 컴퓨터에서 L/F에 프레임 워크를 설치해야합니다. 자신이 가진 동일한 위치에 프레임 워크가없는 사용자에게는 앱이 실행되지 않습니다. –

3

이 작업을 수행하는 일반적인 방법은 프레임 워크 프로젝트와 해당 클라이언트가 공통 빌드 디렉토리를 공유하도록하는 것입니다. Xcode는 다른 위치보다 먼저 프레임 워크 헤더를 검색하고 빌드 폴더 의 프레임 워크 바이너리와 첫 번째로의 프레임 워크 바이너리를 연결합니다. 그래서 컴파일되고 헤더와 연결되는 앱 프로젝트는 설치된 것보다 가장 최근 빌드 된 것을 픽업합니다.

그런 다음 cp -r을 제거하고 대신 설치 위치 빌드 설정을 사용하여 명령 줄에서 xcodebuild install DSTROOT = /를 사용하여 빌드 제품을 최종 위치에 배치 할 수 있습니다. 그러나 프레임 워크를 다시 빌드 할 때마다 완료하는 것이 아니라 완료하면이 작업을 수행하면됩니다.

+0

흥미를 자아 냈지만이 접근법에 두 가지 문제점이 있음을 발견했습니다. 우선, xcodebuild는 DSTROOT =/"Unable to read symbols"문제를 치료합니다. 그러나 : 1) 프레임 워크의 빌드 디렉토리가 공통 빌드 디렉토리 (프로젝트 폴더 외부)를 가리키면 xcodebuild는 프레임 워크에서 변경된 사항을 간과하게됩니다. 프레임 워크 헤더 파일의 수정 된 날짜는 변경되지만 내용은 변경되지 않습니다 (아마도 버전 관리와 관련이 있습니까?). 2) 빌드 디렉토리를 기본 빌드로 다시 변경하면 xcodebuild가 프레임 워크의 다른 복사본을 프레임 워크에 설치합니다. 기묘한. –