2014-05-21 1 views
6

모든 iOS 앱에 사용하는 Silicon이라는 정적 라이브러리를 만들고 있습니다.일반적인 정적 라이브러리가있는 정적 라이브러리를 연결하는 올바른 프로세스는 무엇입니까?

유지 관리하기 어려울 수있는 대규모 정적 라이브러리를 만들고 싶지 않기 때문에 서브 모듈로 첨부하는 더 작은 정적 라이브러리를 많이 만듭니다. |

Silicon
다음과 같이 실리콘이 작성 종속성 트리의 시간으로

입니다
| ==>FDKeychain
| ==>FDDataClient
                |      
          | =>FDRequestClient
                                |          
                      | =>FDFoundationKit
| ==>FDSQLiteDatabase
                |                
| =>FDFoundationKit

당신이 볼 수 있듯이 FDRequestClient 및 FDSQLiteDatabase 모두 ​​일반적인 정적 라이브러리로 FDFoundationKit 있습니다.

Silicon을 사용하는 프로젝트가 빌드 될 때 Silicon의 모든 타겟 종속성이 프로젝트 빌드 디렉토리에 빌드됩니다. FDDataClient와 FDSQLiteDatabase도 마찬가지입니다. 그래서 어느 시점에서 FDRequestClient의 FDFoundationKit이 빌드되어 FDSQLiteDatabase의 FDFoundationKit뿐만 아니라 빌드 디렉토리에도 복사됩니다. 어느 것이 든 마지막으로 작성된 것은 이전 것을 덮어 씁니다.

단순한 행운에 의해 FDFoundationKit은 FDRequestClient와 FDSQLiteDatabase가 항상 동일한 버전을 사용할 수있는 것과 같이 심각한 변화가 없었지만 영원히 그렇게 될 것이라고 보장 할 수는 없습니다.

Silicon이 사용할 FDFoundationKit 버전을 지정하는 방법이 있는지 알아 내려고합니다. 사용 된 버전이 FDRequestClient, FDSQLiteDatabase 및 기타 종속성 모두에서 작동하는지 확인해야 할 책임이 있습니다. 미래에 추가하십시오.

나는이 문제를 해결하려는 CocoaPods의 시도를 알고 있지만 누군가 내 라이브러리를 작동시키기 위해 모든 것을 설정해야하는 것을 원하지 않습니다. 만약 내가 실리콘을 가지고 있다면 FDFoundationKit의 어떤 버전이 모든 것을 사용하는지 완전히 정의 할 수 있다는 것을 발견 할 수있을 것입니다.

+0

CocoasPods를 사용하고 싶지는 않습니다. "내 라이브러리를 작동시키기 위해서 다른 사람을 설치하고 싶지 않으므로"CocoasPods를 사용하고 싶지는 않습니다. 나는 다른 사용자가 여기에서 만들 것이라는 대부분의 제안이 개인 CocoaPod의 일회성 설정을 할 경우 설정하고 관리하는 데 더 많은 시간이 필요하다는 것을 확신합니다. – Emilie

+2

그러나 Silicon의 사용자에게는 설정이 없습니다. 그들은 정적 라이브러리를 링크 만하면 모든 것이 작동합니다. CocoaPods로 전환하면이 라이브러리를 사용하고자하는 모든 사람들이 그것을 필요로합니다. 나는 당신이 그것을 링크하면 올바르게 구축 할 수 있도록이 라이브러리를 가지고 legwork을하려고 노력하고있다. –

답변

0

이 문제에 대한 두 답변이있을 보인다.

2) 릴리스하는 정적 라이브러리 또는 프레임 워크에는 대상 종속성이 없어야합니다. 그들은 당신이 가지고있는 어떤 의존성과도 연결시켜야하며, 필요한 의존성을 통합하는 것은 당신의 라이브러리를 통합하는 사람의 책임입니다.

0

프레임 워크에서 버전 관리를 지원하므로 모든 라이브러리를 프레임 워크에 배치 할 수 있습니다. 프레임 워크는 일반적인 방식으로 구성된 디렉토리 트리입니다. Xcode는 프레임 워크 생성을 직접 지원하지 않으므로 일반적으로 빌드 단계의 마지막 단계에서 스크립트로 만들어야합니다. 예 (jverkoey 덕분에) 최신 버전의 폴더에 대한 링크는 당신이

myLibrary.framework->Versions->n.n folders. 

myLibary.framework->Versions->Current 내의 각 정적 라이브러리의 모든 버전을 저장할 수있는 프레임 워크 내에서 IOS- framework

에 있습니다 찾을 수 있습니다.

정적 라이브러리를 사용하고 있기 때문에 Silicon 자체에서 버전을 지정할 수는 없지만 (동적 라이브러리가 필요함), Silicon 빌드에 사용되는 빌드, 링커 또는 환경 플래그가 확실히 나타납니다.

기본적으로 Apps는 항상 최신 버전의 라이브러리를 사용하지만 링크 된 실제 버전은 빌드 할 때 링커 플래그로 쉽게 재정의 될 수 있습니다. 또한 모든 사용자는 다른 프레임 워크와 동일한 방식으로 실리콘 프레임 워크를 프로젝트에 포함하기 만하므로 개발자에게는 매우 간단합니다.

1) CocoaPods 또는 카르타고와 같은 의존성 관리자를 사용

+2

제 생각에는이 문제는 버전 관리가 아니라 아카이브가 어떻게 구성 되더라도 동일한 심볼이 둘 이상의 정적 라이브러리 (아카이브)에서 볼 수있을 때 심볼을 중복한다고 생각합니다. 동적 링크 라이브러리에는이 문제가 없습니다. – CouchDeveloper

+0

OP는 버전 문제 만 언급합니다. –

+0

저는 실제로 Silicon을 정적 라이브러리에서 프레임 워크로 전환했습니다. @CouchDeveloper는 중복 심볼이 없는지 확인하고자합니다. 내 오픈 소스 프로젝트 중 하나 인 필자의 이상적인 시나리오는 다른 프로젝트에 의존하는 사람을 만들 수 있다는 것입니다.하지만 두 사람 모두 내 의존성이있는 프레임 워크를 두 개 사용하면 충돌이 발생하지 않습니다. –

관련 문제