Студія Android додає зовнішній проект build.gradle


140

У мене є зразковий проект із наступною установкою:

/root
  + Pure Java Lib
  + Android Test Lib
  + Android Test Project

Там, де " Тестовий проект " залежить від " Тестової ліб ", а останній залежить від " Чистої Java Lib " Складання проекту та запуск цієї установки працює чудово.

Зараз я думаю про імпорт попереднього робочого простору Eclipse та роботу зі студією Android, проблема полягає в тому, що налаштування проекту інша, і я хотів би зберегти це таким чином.

наприклад, якщо використовувати попередній приклад:

/root
  + Android Test Lib
  + Android Test Project

/Some Other folder (another repository for example)
  + Pure Java Lib

Я спробував багато конфігурацій, але не знайшов способу посилання на проект поза межами батьківської папки (' root ' у прикладі випадку).

У багатьох платформах / модулях ви можете використовувати ".." для переміщення в папках, але це не спрацювало для мене, можливо, я його неправильно використав.

Хтось знає, як цього можна досягти за допомогою Gradle?

ОНОВЛЕННЯ

Я спробую бути більш загальним:

/C:/

  /Project A
    + Module 1 - Pure Java
    + Module 2 - Android Test Lib
    + Module 3 - Android Test Project

  /Project B
    + Module 1 - Pure Java
    + Module 2 - Pure Java
    + Module 3 - Pure Java

Я хотів би використовувати модуль 1 з проекту Б , в проекті A .


ОНОВЛЕННЯ: 09-03-19

Я це бачив зараз і мушу оновити ... після майже 6 років, сьогодні я мудріший, і я точно можу сказати, що проблема полягала в тому, що я нерозумів поняття "Джерело правди".

Хоча мати один перелік бібліотеки - це приємно мати концепцію .. і це може здатися "джерелом істини", Справжнє "Джерело правди" було б версією коду, який використовує кожен проект цієї бібліотеки. бібліотека сама по собі має версії. У багатьох версіях "Джерело істини" є відносно проекту, який використовує бібліотека.

Правильним способом було б використовувати те, що більшість розробників не любить, а це підмодулі git, і так, дублювання джерел у кожному проекті викликає більшість шансів, що кожен проект використовує іншу версію коду.

Однак вам потрібно буде прагнути, щоб усі ваші проекти використовували найновішу і найбільшу версію всіх ваших бібліотек. Це виклик сам по собі.

Причина, що це правильний спосіб розробити проект з бібліотечними джерелами, полягає в тому, що ця шкала ... у вас може бути сотні проектів, кожен з яких має власну бібліотечну конфігурацію.


4
Я бачу, що це питання привертає деяку увагу ... Після дуже важкої спроби я відмовився від студії Android на даний момент, оскільки складність налаштування, яку я намагався сконструювати, була занадто великою, і побудова мого остаточного проекту була здійснена, але вкрай нестійкий. з кожним запуском студії Android мені довелося знову встановлювати деякі параметри і вручну викликати роботу збірки. пройшло вже два місяці, як я відмовився, і я сподіваюся, що зараз все краще!
TacB0sS

Підхід 2 тут пояснює, як це зробити дуже легко: stackoverflow.com/questions/25610727/…
Дорон Бен-Арі

Відповіді:


222

Якщо припустити, що деяка інша папка є проектом gradle, ви можете додати щось подібне до вашого файла settings.gradle:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')

1
SomeOtherFolder вказує на папку проекту, і в ній є модулі, які мені цікаво додати як модулі до проекту Android Lib
TacB0sS

Параметр dir вказує на "root". Мені потрібно отримати рівень вище, до іншого модуля іншого проекту.
TacB0sS

ви могли б після цього додати підмодулі? include ': someOtherFolder: proj1'
Ethan

1
оновлено деякими подробицями. налаштування.gradle має бути в / Проект А
Етан

5
Чудова відповідь. У AS 1.0.2 мені також потрібно було зробити наступне: Модуль правої кнопки миші -> Відкрити параметри модуля -> Залежності -> + (внизу), вибрати залежність модуля, вибрати зі списку бібліотеку, натиснути ОК :)
Т. Coutlakis

49

Ви повинні помістити у файл settings.gradle наступні рядки:

include ':module2'
project(':module2').projectDir = new File(settingsDir, '../Project 2/Module2')

Потім ви повинні додати до свого builde.gradle (Модуль: додаток) у дерево залежностей цей рядок:

implementation project(':module2')

або увійдіть в Структура проекту > додаток > Залежності , натисніть кнопку Додати , виберіть 3 Модульні залежності і виберіть свій модуль


1
Якщо у вас є проблеми з посиланням на класи бібліотеки з основного додатка, це тому, що бібліотека, ймовірно, є в різних варіантах. Таким чином, просто вказати залежність належним чином: compile project(path: ':library', configuration: 'variant'). Тут variantскладається flavorі buildTypeяк визначено build.gradleфайлом бібліотеки . Наприклад, якщо ви хочете releaseпобудувати тип бібліотеки за developсмаком, то variantє developRelease.
Севастян Саванюк

9

З Gradle 1.10 (не знаю, для яких інших версій це буде дійсно) це те, що я придумав на основі відповіді, наданої тут http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

У мене є проект бібліотеки api, спільний проект бібліотеки та основний проект програми. Кожна з них є окремим проектом розробки, і дві бібліотеки призначені для спільного використання між кількома програмами.

У settings.gradle для спільного проекту:

def apiLibDir = file('../android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

Потім у головних налаштуваннях проекту програми.gradle:

def apiLibDir = file('../android-libs/android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

def commonLibDir = file('../android-libs/android-common/android-common-lib')
settings.createProjectDescriptor(rootProjectDescriptor, 'android-common-lib', commonLibDir)
include ':android-common-lib'

У кожному з відповідних файлів build.gradle ви просто посилаєтесь на ім’я, яке ви вказали їм у settings.createProjectDescriptor, як і будь-яка інша залежність проекту:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':android-api-lib')
    compile project(':android-common-lib')
}

Це, здається, працює. Я навіть не видав помилку для декількох файлів DEX, що визначають бібліотеку api, я підозрюю, тому що це все було частиною одного і того ж процесу збирання, а Gradle був досить розумним, щоб усе це зрозуміти.


2
Я намагаюся це зробити, але проблема полягає в тому, що залежності у відповідній бібліотеці, здається, ніколи не завантажуються. Тож якщо у мене просто відкрита бібліотека, це здається прекрасним, але коли я спробую це з головного додатку, він каже, що всі імпортовані бібліотеки відсутні.
Czechnology

@ Чехологія мала таку ж проблему. Вирішили це. Дивіться мій коментар до цього відповіді: stackoverflow.com/a/29603354/7408927
Севастян Savanyuk

9

Клацніть правою кнопкою миші на проект - Виберіть "Відкрити параметри модуля" - Виберіть "Модулі" на лівій панелі - Клацніть на символі "+" вгорі - Виберіть "Імпортувати модуль".

Після імпорту модуля. Вам потрібно додати його як залежність від вашого поточного проекту.

Збережіть "Модулі", вибрані на лівій панелі, та натисніть на ваш проект. Тепер перейдіть на вкладку "Залежності" та натисніть на символ "+", який знаходиться внизу - Виберіть третій варіант "Залежності модуля", і якщо ви імпортували проект правильно, він буде покаже вам весь доступний модуль, який можна додати як залежність до вашого поточного проекту.


Це майже не працює ... проект неможливо побудувати, оскільки вихід модуля залежності не додається до файлу build.gradle, що саме є моїм оригінальним випуском.
TacB0sS

Я думаю, що з gradle вам потрібно помістити всі проекти в одну кореневу папку. Спробуйте це. Помістіть проект, який ви хочете додати як залежність, у ту ж папку, що і ваш поточний проект.
Варундоїд

Це те, що ніхто не хоче робити, крім банкоматів, якщо ви хочете працювати з Android Studio, це спосіб змусити роботу працювати. Ще одним альтернативним способом, який я дотримуюся, є створення проекту в налаштуваннях Intellij всіх залежностей, а потім імпорт цього проекту в студію Android, роблячи це, я змушую Android Studio використовувати систему збирання мурашок, а не Gradle. Сподіваюся, це допомагає. Ура !!
Варундоїд

1
@Varundroid, рішення - спочатку імпортувати посилання на окрему бібліотеку, використовуючи відповідь Ітана. Потім додайте модуль до основних залежностей програми, використовуючи свою відповідь. Це дозволяє посилатися на одну і ту ж бібліотеку в декількох додатках без необхідності дублювання коду бібліотеки.
bcorso

1

Я повторно задаю це питання так, що тягне за собою оригінальні наміри плакатів Як ми посилаємось на власні бібліотеки Android та Java, які живуть за межами каталогу нашого головного Android-проекту?

Там я відповідаю на власне запитання. В основі моєї відповіді використовується @ Ethan's (автор обраної відповіді в поточній нитці) Gradle кодування розуміння. Але моя відповідь також орієнтується на деякі інші ґетчі та наводить докладний крок за кроком.


-1

Як сказав Етан, якщо ви додасте це до свого settings.gradle, він додасть зовнішній проект до Android Studio (у цьому прикладі це в батьківській папці):

project(':../ProjectB/:module1')

Потім, щоб додати його як залежність одного із своїх проектів, просто додайте його у build.gradle цього проекту як іншу залежність, як ця (ви також можете зробити це графічно, як тут ):

compile project(':../ProjectB/:module1')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.