Подтвердить что ты не робот

Относительные зависимости проекта в Gradle?

При указании зависимостей проекта 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')
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

  • Включите библиотеку в settings.gradle и переопределите projectDir:

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

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

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

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

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

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

Ответ 3

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

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

WebApp-а/settings.gradle

include '..:domain-a'

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

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

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

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

Ответ 4

Поздний ответ никогда не болит. Мое решение было близко к тому, что предложил @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')

Ответ 5

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