我正在尝试构建一个Android库,我有以下内容:
- 库的Github Repo
- 库1:Kotlin本机/多平台代码,可编译到Android和iOS
- 库2:Kotlin/JVM代码依赖于库1
- 示例应用程序:使用库2和库1的应用程序
- 个人Android项目
- 依赖于上面的Github库
在我的个人项目中,我只有:
implementation 'com.github.username:myrepo:0.5'
问题
私有安卓项目正在加载安卓库(库2(,但多平台kotlin模型和函数(库1(不可访问。
请注意,库的示例应用程序运行良好。我怀疑jitpack.io没有正确发布工件。你知道如何解决这个问题吗?有什么应该对渐变文件做的来解决这个问题吗?
我希望多平台图书馆单独出版。我试图从多平台Kotlin模块访问它,但我得到了"无法解析依赖项"。这就是我尝试的:
implementation 'com.github.username.myrepo:library1_moduleName:0.1'
Library 1多平台渐变:
plugins {
kotlin("multiplatform")
}
kotlin {
//select iOS target platform depending on the Xcode environment variables
val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iOSTarget("ios") {
binaries {
framework {
baseName = "library1"
freeCompilerArgs.add("-Xobjc-generics")
}
}
}
jvm("android")
sourceSets["commonMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
}
sourceSets["androidMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
}
val packForXcode by tasks.creating(Sync::class) {
val targetDir = File(buildDir, "xcode-frameworks")
/// selecting the right configuration for the iOS
/// framework depending on the environment
/// variables set by Xcode build
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val framework = kotlin.targets
.getByName<KotlinNativeTarget>("ios")
.binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
from({ framework.outputDirectory })
into(targetDir)
/// generate a helpful ./gradlew wrapper with embedded Java path
doLast {
val gradlew = File(targetDir, "gradlew")
gradlew.writeText(
"#!/bin/bashn"
+ "export 'JAVA_HOME=${System.getProperty("java.home")}'n"
+ "cd '${rootProject.rootDir}'n"
+ "./gradlew $@n"
)
gradlew.setExecutable(true)
}
}
tasks.getByName("build").dependsOn(packForXcode)
库2 的渐变
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
compileSdkVersion 29
buildToolsVersion "29.0.0"
defaultConfig {
minSdkVersion 19
targetSdkVersion 29
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
api project(":library1")
}
我建议您更改针对android的build.gradle
配置/将其更改为
plugins {
kotlin("multiplatform")
id("com.android.library")
id("maven-publish")
}
android {
compileSdkVersion 29
buildToolsVersion "29.0.0"
defaultConfig {
minSdkVersion 19
targetSdkVersion 29
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
kotlin {
//select iOS target platform depending on the Xcode environment variables
val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iOSTarget("ios") {
binaries {
framework {
baseName = "library1"
freeCompilerArgs.add("-Xobjc-generics")
}
}
}
// jvm("android")
android {
publishLibraryVariants("release")
}
sourceSets["commonMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
}
sourceSets["androidMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
}
val packForXcode by tasks.creating(Sync::class) {
val targetDir = File(buildDir, "xcode-frameworks")
/// selecting the right configuration for the iOS
/// framework depending on the environment
/// variables set by Xcode build
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val framework = kotlin.targets
.getByName<KotlinNativeTarget>("ios")
.binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
from({ framework.outputDirectory })
into(targetDir)
/// generate a helpful ./gradlew wrapper with embedded Java path
doLast {
val gradlew = File(targetDir, "gradlew")
gradlew.writeText(
"#!/bin/bashn"
+ "export 'JAVA_HOME=${System.getProperty("java.home")}'n"
+ "cd '${rootProject.rootDir}'n"
+ "./gradlew $@n"
)
gradlew.setExecutable(true)
}
}
tasks.getByName("build").dependsOn(packForXcode)
在src/main/AndroidManifest.xml
下为库1创建一个AndroidManifest.xml
文件
<manifest package="library1"/>
你现在可以把你的项目推到github,创建一个标签,然后等待jitpack完成它神奇的
当你想在库2中使用它时,在dependencies
部分下,只需添加
implementation 'com.github.username.myrepo:library1-android:0.1' //for android
认为您可能需要为多平台库启用元数据;在settings.gradle
:中
enableFeaturePreview('GRADLE_METADATA')
以及为Maven配置库(尚不清楚如何将其发布到GitHub,因为build.gradle
没有任何自动化功能(。即使在将其发布到GitHub而不是mavenLocal()
时,它也可能需要提供某种元数据。。。如"无法解析依赖项"可能提示的那样,假设它存在于引用的包名称下。
apply plugin: 'maven-publish'
group 'com.github.username'
version '1.0.0'
配置api
只适用于多个模块引用的依赖项;所有其他(任何一次出现(都应该是implementation
。我的意思是,我发现库2build.gradle
令人困惑,因为它首先读取maven { url 'https://jitpack.io' }
(实际上没有引用远程依赖项(,然后读取api project(":library1")
(显然是本地依赖项(。