2011-09-19 5 views
6

Android 프로젝트를 구성하는 데 가장 좋은 방법 (또는 모범 사례)을 파악하는 데 약간의 도움이 필요합니다. 간단히하기 위해 안드로이드 용 Eclipse 작업 공간이 C:\Android\Projects\이라고 가정 해 봅시다. 그 폴더 안에는 라이브러리에서 응용 프로그램을 분리하고 다른 두 개의 폴더 인 C:\Android\Projects\ApplicationsC:\Android\Projects\Components이 있습니다.라이브러리를 포함한 Android 프로젝트의 소스 컨트롤을 어떻게 구성해야합니까?

나는 Components 폴더에 GitHub의에서 라이브러리를 복제 한 하나 개의 프로젝트를 위해

,의는 C:\Android\Projects\Componentes\SampleLib을 가정 해 봅시다 (해당 폴더 안에 두 개의 폴더 TheLibTheLibExample있다). 그리고 내 응용 프로그램은 C:\Android\Projects\Applications\MyTestApp으로 생성됩니다. 그런 다음 these instructions에 따라 라이브러리를 앱에 포함 시켰습니다.

이제 GitHub를 사용하여 내 앱을 오픈 소스 커뮤니티와 공유하려고한다고 가정 해 보겠습니다. 저장소를 만들고 C:\Android\Projects\Applications\MyTestApp의 모든 것을 저장소에 넣을 것입니다.

누군가 내 앱을 포크하거나 나를 도우려면 프로젝트 자체에 포함되지 않은 라이브러리를 컴파일하고 실행해야합니다. default.properties 파일은 android.library.reference.1=../Components/SampleLib/TheLib과 비슷할 것이고 다른 누군가가 해당 라이브러리를 수동으로 복제해야하고 동일한 상대 경로에 배치해야합니다. 그렇지 않으면 내 응용 프로그램의 소스 제어가 엉망이 될 것입니다.

C:\Android\Projects\Applications\MyTestApp\TheApp 
C:\Android\Projects\Applications\MyTestApp\TheLib 
C:\Android\Projects\Componentes\SampleLib 

그리고 내 저장소는 C:\Android\Projects\Applications\MyTestApp\의 내용으로 채워 져야 :이 문제를 해결 생각할 수

유일한 방법은 다음과 같이 내 작업 공간을 구성하는 것입니다.

하지만 라이브러리가 업데이트되면 어떻게됩니까? 단순히 새로운 변경 사항을 가져올 수 없으므로 그 파일을 TheLib 폴더에 복사해야합니다. 이전의 폴더 구성에서는 복사본이 아닌 원래의 복제 된 저장소를 참조 했으므로 필요하지 않았습니다.

그럼 어떻게해야합니까? 옵션 1을 선택하고 내 프로젝트를 포크하는 사람이 라이브러리 종속성을 적절하게 처리하도록해야합니까? 그렇지 않으면 두 번째 폴더와 함께 이동해야하며 원본 폴더가 변경되면 두 폴더를 동기화하여 더 많은 작업을 수행해야합니다. 저장소?

+0

어떻게 bitbucket에 대한이 문제가 해결 되었습니까? bitbucket 프로젝트에 내 라이브러리를 추가하지 않음 – Erum

답변

4

아마도 하위 서브 모듈이 문제를 해결할 것입니다.

+0

조금 혼란 스럽습니다. 앞으로 더 깊이 파헤쳐 야 할 것입니다. 왜냐하면 지금은 그냥 그대로 두는 것입니다. 하지만 submodules 정확히 내가 뭘 찾고 있던 것 같아요 :) –

+0

자식 서브 모듈은 매우 혼란스럽고 내 생각에 너무 복잡하여 사건. 내가 읽은 서브 모듈은 제 3 자 라이브러리를 포함하고자 할 때 권장되는데, 드물게 (다른 릴리즈가있을 때만) 업데이트 할 것입니다. 자신의 라이브러리에서 제대로 작동하지 않아 자주 업데이트됩니다. 대신 git 하위 트리를 사용해보십시오. http://apenwarr.ca/log/?m=200904#30 –

1

개인적으로 안드로이드의 라이브러리 프로젝트는 FAIL 디자인이라고 생각합니다. 다른 코드를 참조/사용하려는 유일한 방법은 다른 전체 프로젝트를 가져 와서 IDE 구성 수준에서 모든 것을 설정하는 것입니다. 도서관이란 무엇입니까? 그것은 아카이브 형식으로 컴파일되고 패키징 된 재사용 가능한 구성 요소 여야합니다. 그들의 중요한 메모 Library project storage location에 따르면, 나는 우리가 넥타이를 깰 수 있고 라이브러리를 실제 라이브러리로 관리 할 수있는 쉬운 해결 방법이 없다고 생각합니다. 라이브러리가 그렇게 안드로이드 화되지 않았다면, 쓰기/빌드를 일반 jar 라이브러리로 사용하고 maven을 사용하여 jar 라이브러리 빌드/릴리스 및 프로젝트 종속성을 관리하십시오.

흠, 구글이 안드로이드 라이브러리 프로젝트을 안드로이드가 아니라 라이브러리이라고 부르는 것이 합리적입니다.

+0

다른 프로젝트의 전체 설정에 대해 동의합니다. Windows/C#에서 어디서 .dll 파일을 참조 할 수 있습니까? 이제 Android에서 이와 유사한 작업을 수행 할 수 없습니다. 그래도 당신의 대답은 내 질문에 정말로 답하지 않습니다. 그리고 도서관은 제 것이 아니라 다른 누군가의 것입니다. 나는 정직하게 Maven이 무엇인지 모르고 있으며, 지금은 새로운 것을 배우기 위해 고민 할 수 없다. –

+0

이 답변이 아니므로 주석으로 추가하려고했지만 크기가 넘치게되었습니다. P – yorkw

+1

Android 라이브러리 프로젝트와 jar 파일이있는 자바에서 매우 중요한 차이점이 있습니다. 차이점은 라이브러리 프로젝트는 기본 프로젝트로 복사되지 않는다는 것입니다. 디스크 크기를 절약하기 위해 사용 된 부품 만 복사되어 주 프로젝트에 컴파일됩니다. 또한 리소스는 라이브러리 프로젝트를 대체하기 때문에 주 프로젝트에서 쉽게 변경할 수 있습니다. 화이트 라벨 앱에 딱! 그런 것을 좋아하지 않는다면 라이브러리를 개발하여 프로젝트에 병으로 추가 할 수 있습니다. 사과와 바나나를 비교하지 마십시오! – WarrenFaith

1

나는 개인적으로 자식 서브 모듈이 라이브러리 의존성에 대해 매우 사용하기 쉽고 강력한 시스템을 제공하지 않는다고 생각한다.

더 나은 대안은 하위 트리입니다. 나는 그것을하는 방법을 설명하는 a very useful guide을 발견했다.

은 기본적으로 당신은 당신의 종속성을 포함하는 하위 폴더를 생성하고 그 하위 폴더 내부 복제 저장소 수 있습니다 : 다음

$ mkdir vendor 
$ git remote add -f ABS https://github.com/JakeWharton/ActionBarSherlock 
$ git merge -s ours --no-commit ABS/master 
$ git read-tree --prefix=vendor/ABS/ -u ABS/master 
$ git commit -m "Merged ABS into vendor/ABS/" 
# Now another lib 
$ git remote add -f Crouton https://github.com/keyboardsurfer/Crouton 
$ git merge -s ours --no-commit Crouton/master 
$ git read-tree --prefix=vendor/Crouton/ -u Crouton/master 
$ git commit -m "Merged Crouton into vendor/Crouton/" 

, 당신은 vendor/ 내부의이 예에서는 두 가지의 repos/libs가있을 것이다; 그것들을 IDE/빌드 시스템에 추가하기 만하면됩니다.

힘내 분기 및 수정은 서브 모듈보다 훨씬 쉽고 직관적입니다.

나는 libs 목록을 위해이 과정을 자동화하는 a small script을 만들었습니다.

관련 문제