У меня есть образец проекта со следующей настройкой:
/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, и да, дублирование источников в каждом проекте приводит к большей вероятности, что каждый проект использует другую версию кода.
Однако вам нужно будет стремиться к тому, чтобы все ваши проекты использовали самую последнюю и лучшую версию всех ваших библиотек ... что само по себе является проблемой
Причина, по которой это правильный способ разработки проекта с исходными кодами библиотеки, заключается в том, что он масштабируется ... у вас могут быть сотни проектов, каждый со своей собственной конфигурацией библиотеки.
Ответы:
Предполагая, что Some Other Folder является проектом gradle, вы можете добавить что-то вроде следующего в свой файл settings.gradle:
include ':module1' project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')
источник
Вы должны поместить в свой файл settings.gradle следующие строки:
include ':module2' project(':module2').projectDir = new File(settingsDir, '../Project 2/Module2')
Затем вам нужно добавить в свой buildde.gradle (Module: app) в дерево зависимостей эту строку:
implementation project(':module2')
или перейдите в Структура проекта > приложение > Зависимости , нажмите Добавить , выберите 3 зависимости модуля и выберите свой модуль
источник
compile project(path: ':library', configuration: 'variant')
. Здесьvariant
состоит из файла библиотекиflavor
иbuildType
определяется имbuild.gradle
. Например, если вам нуженrelease
тип сборки библиотеки в разновидностиdevelop
, тоvariant
естьdevelopRelease
.С 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 был достаточно умен, чтобы все это понять.
источник
Щелкните правой кнопкой мыши проект - выберите «Открыть настройки модуля» - выберите «Модули» на левой панели - Щелкните значок «+» вверху - выберите «Импортировать модуль».
После импорта Module. Вам нужно добавить его как зависимость для вашего текущего проекта.
Оставьте «Модули» выбранными на левой панели и щелкните свой проект - Теперь перейдите на вкладку зависимостей и щелкните символ «+», расположенный внизу - Выберите третий вариант «Зависимости модулей», и если вы правильно импортировали свой проект, он будет покажет вам все доступные модули, которые могут быть добавлены в качестве зависимости к вашему текущему проекту.
источник
Я задаю этот вопрос еще раз, исходя из намерений оригинальных плакатов на Как мы можем ссылаться на пользовательские библиотеки Android и Java, живущие вне каталога нашего основного проекта Android»?
Там я отвечаю на свой вопрос. По сути, в моем ответе используется понимание кодирования Gradle @ Ethan (автор выбранного ответа в текущем потоке). Но в моем ответе также рассматриваются некоторые другие ошибки и приводится подробный пошаговый пример.
источник
Как сказал Итан, если вы добавите это в свой settings.gradle, он добавит внешний проект в Android Studio (в этом примере он находится в родительской папке):
project(':../ProjectB/:module1')
Затем, чтобы добавить его как зависимость одного из ваших проектов, просто добавьте его в build.gradle этого проекта как другую подобную зависимость (вы также можете сделать это графически как здесь ):
compile project(':../ProjectB/:module1')
источник