Относительные зависимости проекта в Gradle? - PullRequest
28 голосов
/ 17 марта 2012

При указании зависимостей проекта Gradle можно ли избегать использования полного абсолютного имени проекта и использовать вместо него относительное?(т.е. в моем примере я не хочу явно указывать: app-a при ссылке: domain-a)

//Directory structure
app-a/
  domain-a/
    build.gradle
  webapp-a/
    build.gradle

WebApp-A build.gradle:

apply plugin: 'java'

//Build.gradle for webapp-a
dependencies {

  // Works
  compile project(':app-a:domain-a')

  //Doesn't work
  compile project(projectDir.path + '/../domain-a/')

  //Doesn't work
  compile findProject('../domain-a')

  //Doesn't work
  compile project(':domain-a')
}

Ответы [ 5 ]

38 голосов
/ 08 июня 2013

Для разработки Android под Android Studio и Gradle, вот как скомпилировать библиотеку, которая не находится в корне вашего проекта, но имеет относительный путь:

  1. Включите библиотеку в settings.gradle и переопределите каталог проекта:

    include 'MyTestLibProject:MyTestLib'
    project(':MyTestLibProject:MyTestLib').projectDir = new File(settingsDir, '../MyTestLibProject/MyTestLib')
    
  2. Отредактируйте build.gradle для библиотеки, чтобы использовать плагин android-library вместо android, что приводит к тому, что выходные данные библиотеки включаются в проекты, ссылающиеся на него:

    apply plugin: 'android-library'
    
  3. Укажите, что ваш проект зависит от lib, отредактировав build.gradle для не-lib проекта:

    compile project(path: ':MyTestLibProject:MyTestLib')
    
  4. Если в lib есть какие-либо jar-файлы, которые есть и в вашем проекте, сборка будет видеть их как столкновение при генерации apk. Abstract jar в дополнительную библиотеку, на которую ссылаются как проект, так и lib, или просто исключает сталкивающийся jar из основного проекта и позволяет ему выбрать jar из зависимости:

    dependencies {
        compile fileTree(dir: 'libs', include: '*.jar', exclude: '**/android-support-v4.jar')
        compile project(path: ':MyTestLibProject:MyTestLib')
    }
    

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Gradle не хочет, чтобы вы это делали - вы намерены опубликовать библиотеку, используя maven, а затем ссылаться на зависимость, используя "POM" опубликованной библиотеки (которая включает номер версии). Это обеспечивает лучшее управление зависимостями - например, maven упрощает сценарий, когда во многих проектах (с разными циклами выпуска) используются разные версии общей библиотеки. Метод относительного пути, описанный здесь, - это быстрый способ начать работу с небольшими проектами или как промежуточный шаг для проектов, портируемых из ant.

Ссылка: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Creating-a-Library-Project

8 голосов
/ 23 декабря 2013

Хотя использование относительных путей может быть плохой практикой, иногда вам может понадобиться именно так Тем не менее, вот как вы можете заставить его работать.

Вам нужно создать settings.gradle файл внутри webapp-a

WebApp-а / settings.gradle

include '..:domain-a'

Затем в webapp-a / build.gradle

compile project(':..:domain-a')

(сам не проверял, но должно работать)

EDIT: заменено ../domain-a на ..:domain-a в обоих файлах

1 голос
/ 17 марта 2012

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

С точки зрения извлечения родительского проекта в качестве зависимости это будет сделано через родительский каталог по умолчанию, или, если он потерпит неудачу, будет использован обычный механизм разрешения зависимостей, который использует координаты (groupId, artifactId и version) и просматривает артефакт в локальном хранилище ..

0 голосов
/ 24 октября 2017

Использовать проект компиляции ':'.Больше ничего не требуется.Теперь ваш проект «using» будет использовать этот общий проект в вашей файловой системе / Eclipse / IntelliJ.

0 голосов
/ 12 апреля 2016

Поздний ответ никогда не повредит.Мое решение было близко к тому, что предложил @lihsus.

Скажем, у вас есть следующая структура проекта:

//Directory structure
app-a/
   domain-a/
       build.gradle
   webapp-a/
       build.gradle

Убедитесь, что ваше app-a имеет build.gradle и settings.gradle .

В settings.gradle из app-a вы можете включить обамодули / проекты, такие как:

include ':domain-a'
include ':webapp-a'

А затем в webapp-a вы можете добавить domain-a в качестве зависимости компиляции, как вы предложили:

compile project(':domain-a')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...