创建jvm和Kotlin多平台的混合Github库



我正在尝试构建一个Android库,我有以下内容:

  • 库的Github Repo
    • 库1:Kotlin本机/多平台代码,可编译到Android和iOS
    • 库2:Kotlin/JVM代码依赖于库1
    • 示例应用程序:使用库2和库1的应用程序
  • 个人Android项目
    • 依赖于上面的Github库

在我的个人项目中,我只有:

implementation 'com.github.username:myrepo:0.5'

问题

  1. 私有安卓项目正在加载安卓库(库2(,但多平台kotlin模型和函数(库1(不可访问。

    请注意,库的示例应用程序运行良好。我怀疑jitpack.io没有正确发布工件。你知道如何解决这个问题吗?有什么应该对渐变文件做的来解决这个问题吗?

  2. 我希望多平台图书馆单独出版。我试图从多平台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")(显然是本地依赖项(。

最新更新