Как сделать так, чтобы транзитивные зависимости библиотеки отображались в приложении при использовании BillOfMaterials? - PullRequest
3 голосов
/ 21 января 2020

Я считаю, что транзитивные зависимости моей библиотеки не отображаются в приложении, особенно когда в моей библиотеке используется maven BoM.

Когда нет BoM, в приложении появляются транзитивные зависимости. Вот иллюстрация случая, когда сторонняя библиотека правильно отображается как зависимость времени выполнения в my-app.

[my-app] --> [my-lib] --> [3rd-party-lib]

Но когда я использую BoM в своей библиотеке (показано ниже), она не отображается в зависимости от времени выполнения в моем приложении. Это вызывает cra sh во время выполнения!

[my-app] --> [my-lib] --> [bom] --> [3rd-party-lib]

Вот код, с которым эта проблема воспроизводима:

// bom/build.gradle

plugins {
    id 'java-platform'
    id 'maven-publish'
}

publishing {
    publications {
        bom(MavenPublication) {
            from components.javaPlatform
        }
    }
}

group "com.example"
version "0.0.3"

dependencies {
    constraints {
        api "com.jakewharton.timber:timber:4.7.1" // 3rd-party-lib
    }
}
// mylibrary/build.gradle

apply plugin: 'com.android.library'
<<removed stuff for brevity>>

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.2'

    api platform("com.example:bom:0.0.3")
    api "com.jakewharton.timber:timber"
}

// This helps to publish this library to maven local.
apply from: "https://raw.githubusercontent.com/sky-uk/gradle-maven-plugin/1.0.4/gradle-mavenizer.gradle"
// myapp/build.gradle

apply plugin: 'com.android.application'
<<removed stuff for brevity>>

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.2'

    implementation "com.example:mylibrary:1.0.0"
}

В этом случае древесина сторонняя библиотека Как уже упоминалось, это не отображается в приложении, когда mylibrary использует BoM. В результате происходит сбой приложения при каждом вызове приложением mylibrary-кода, для которого внутренне требуется древесина.

Как обеспечить, чтобы mylibrary вносил в приложение переходные зависимости?

PS: я публикую sh в mylibrary для местный житель.

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Мое непроверенное (!) Предположение могло бы состоять в том, что этот «Gradle Maven Plugin» , который вы применяете в своей библиотеке, может быть виновником. Он выполняет некоторое искажение зависимостей, записанных в опубликованном POM, что может быть ложным для спецификаций.

FWIW, вся установка работает для меня без этого плагина (и простой библиотеки Java / приложение из-за отсутствия Android SDK на моем текущем компьютере). Ниже вы можете найти (полную) рабочую настройку.

Я знаю, это может быть не точный ответ. Возможно, это все же поможет вам отследить проблему.

Минимальная рабочая настройка

.
├── bom
│   └── build.gradle
├── myapp
│   └── build.gradle
└── mylibrary
    └── build.gradle

bom/build.gradle

имеет то же содержание, что и в вопросе

mylibrary/build.gradle

apply plugin: 'java-library'

group "com.example"
version "1.0.0"

repositories {
    jcenter()
}

dependencies {
    api platform("com.example:bom:0.0.3")
    api "com.jakewharton.timber:timber"
}

myapp/build.gradle

plugins {
    id 'java'
}

repositories {
    jcenter()
}

dependencies {
    implementation "com.example:mylibrary:1.0.0"
}

Убедитесь, что он работает

Запустите его из каталога myapp/ (используя Gradle 6.1.1 Оболочка не входит в комплект):

./gradlew dependencies --include-build ../mylibrary/ --include-build ../bom/
1 голос
/ 28 января 2020

Это работает так, как задумано, поскольку Maven транзитивные зависимости читает (что также относится к Gradle):

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

Если вы действительно хотите форсировать его, вы можете теоретически exclude их из зависимости Gradle и вместо этого добавить их как отдельные (нетранзитивные) зависимости - но это не обязательно. Это имеет смысл только, например. при намерении предоставить более новую версию - или при работе с конфликтами версий. Если целью является создание автономных автономных проектов, есть другие способы .

...