Студия Android добавляет внешний проект в build.gradle

140

У меня есть образец проекта со следующей настройкой:

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

Где « Тестовый проект » зависит от « Test Lib », а последний зависит от « Pure Java Lib ». Компиляция проекта и запуск этой настройки работают нормально.

Сейчас я подумываю импортировать мое предыдущее рабочее пространство Eclipse и работать со студией Android, проблема в том, что настройка проекта отличается, и я хотел бы сохранить ее в таком виде.

например, если использовать предыдущий пример:

/root
  + Android Test Lib
  + Android Test Project

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

Я пробовал много конфигураций, но не нашел способа ссылаться на проект, выходящий за рамки родительской папки (« корень » в данном примере).

На многих платформах / модулях вы можете использовать ".." для перемещения вверх по папкам, но у меня это не сработало, возможно, я использовал его неправильно.

Кто-нибудь знает, как этого можно достичь с помощью 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, и да, дублирование источников в каждом проекте приводит к большей вероятности, что каждый проект использует другую версию кода.

Однако вам нужно будет стремиться к тому, чтобы все ваши проекты использовали самую последнюю и лучшую версию всех ваших библиотек ... что само по себе является проблемой

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

TacB0sS
источник
4
Я вижу, что этот вопрос привлекает некоторое внимание ... После очень серьезных попыток я отказался от студии Android на данный момент, поскольку сложность настройки, которую я пытался построить, была слишком большой, и создание моего окончательного проекта было выполнимым, но крайне нестабильно. при каждом запуске студии Android мне приходилось снова устанавливать некоторые параметры и вручную заставлять сборку работать. Прошло около двух месяцев с тех пор, как я сдался, и я надеюсь, что сейчас все стало лучше!
TacB0sS
Подход 2 здесь объясняет, как это сделать очень легко: stackoverflow.com/questions/25610727/…
Дорон Бен-Ари,

Ответы:

223

Предполагая, что Some Other Folder является проектом gradle, вы можете добавить что-то вроде следующего в свой файл settings.gradle:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')
Итан
источник
1
SomeOtherFolder указывает на папку проекта, и в ней есть модули, которые мне интересно добавить в качестве модулей в проект Android Lib
TacB0sS 05
Каталог настроек указывает на «root», мне нужно подняться на уровень выше, на другой модуль в другом проекте.
TacB0sS 05
не могли бы вы добавить подмодули после этого? include ': someOtherFolder: proj1'
Итан
1
обновлен с некоторыми деталями. settings.gradle должен быть в / Project A
Итан
5
Отличный ответ. В AS 1.0.2 мне также нужно было сделать следующее: щелкните правой кнопкой мыши модуль -> Открыть настройки модуля -> Зависимости -> + (внизу), выберите Зависимость модуля, выберите свою библиотеку из списка, нажмите ОК :)
T. Coutlakis
49

Вы должны поместить в свой файл settings.gradle следующие строки:

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

Затем вам нужно добавить в свой buildde.gradle (Module: app) в дерево зависимостей эту строку:

implementation project(':module2')

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

Дарио Брукс
источник
1
Если у вас есть проблемы со ссылками на классы библиотеки из основного приложения, это связано с тем, что библиотека, вероятно, поставляется в разных вариантах. Таким образом, просто указать зависимость надлежащим образом: compile project(path: ':library', configuration: 'variant'). Здесь variantсостоит из файла библиотеки flavorи buildTypeопределяется им build.gradle. Например, если вам нужен releaseтип сборки библиотеки в разновидности develop, то variantесть developRelease.
Севастян Саванюк 09
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'

Затем в главном проекте приложения settings.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 был достаточно умен, чтобы все это понять.

alphonzo79
источник
2
Я пытаюсь это сделать, но проблема в том, что зависимости в соответствующей библиотеке, похоже, никогда не загружаются. Поэтому, если у меня открыта только библиотека, все в порядке, но когда я пробую ее из основного приложения, он говорит, что все импортированные библиотеки отсутствуют.
Chechnology
@Czechnology Была такая же проблема. Решил это. См. Мой комментарий к этому ответу: stackoverflow.com/a/29603354/7408927
Севастян Саванюк,
9

Щелкните правой кнопкой мыши проект - выберите «Открыть настройки модуля» - выберите «Модули» на левой панели - Щелкните значок «+» вверху - выберите «Импортировать модуль».

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

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

Варундроид
источник
Это почти работает ... проект не может быть построен, потому что вывод модуля зависимостей не добавляется в файл build.gradle, что является моей исходной проблемой.
TacB0sS 05
Я думаю, что с gradle вам нужно поместить все проекты в одну корневую папку. Попробуй это. Поместите проект, который вы хотите добавить в качестве зависимости, в ту же папку, что и ваш текущий проект.
Varundroid 05
Это то, чем никто не хочет заниматься, кроме ATM, если вы хотите работать с Android Studio, это способ заставить все работать. Другой альтернативный способ, которым я следую, - я создаю проект в Intellij, настраиваю все зависимости, а затем импортирую этот проект в студию Android, делая это, я заставляю Android Studio использовать систему сборки ant, а не Gradle. Надеюсь, это поможет. Ура !!
Varundroid 07
1
@Varundroid, решение состоит в том, чтобы сначала импортировать ссылку на автономную библиотеку, используя ответ Итана. Затем добавьте модуль в зависимости основного приложения, используя свой ответ. Это позволяет вам ссылаться на одну и ту же библиотеку в нескольких приложениях без необходимости дублировать код библиотеки.
bcorso
1

Я задаю этот вопрос еще раз, исходя из намерений оригинальных плакатов на Как мы можем ссылаться на пользовательские библиотеки Android и Java, живущие вне каталога нашего основного проекта Android»?

Там я отвечаю на свой вопрос. По сути, в моем ответе используется понимание кодирования Gradle @ Ethan (автор выбранного ответа в текущем потоке). Но в моем ответе также рассматриваются некоторые другие ошибки и приводится подробный пошаговый пример.

Джон Бентли
источник
-1

Как сказал Итан, если вы добавите это в свой settings.gradle, он добавит внешний проект в Android Studio (в этом примере он находится в родительской папке):

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

Затем, чтобы добавить его как зависимость одного из ваших проектов, просто добавьте его в build.gradle этого проекта как другую подобную зависимость (вы также можете сделать это графически как здесь ):

compile project(':../ProjectB/:module1')
Яир Кукелька
источник