Skip to content

Commit a67e503

Browse files
authored
Merge pull request #342 from icerockdev/develop
Release 0.20.0
2 parents a4a0454 + 187cd86 commit a67e503

19 files changed

Lines changed: 788 additions & 29 deletions

File tree

README.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ buildscript {
4545
}
4646
4747
dependencies {
48-
classpath "dev.icerock.moko:resources-generator:0.19.1"
48+
classpath "dev.icerock.moko:resources-generator:0.20.0"
4949
}
5050
}
5151
@@ -63,10 +63,10 @@ project build.gradle
6363
apply plugin: "dev.icerock.mobile.multiplatform-resources"
6464
6565
dependencies {
66-
commonMainApi("dev.icerock.moko:resources:0.19.1")
67-
androidMainApi("dev.icerock.moko:resources-compose:0.19.1")
68-
jvmMainApi("dev.icerock.moko:resources-compose:0.19.1")
69-
commonTestImplementation("dev.icerock.moko:resources-test:0.19.1")
66+
commonMainApi("dev.icerock.moko:resources:0.20.0")
67+
androidMainApi("dev.icerock.moko:resources-compose:0.20.0")
68+
jvmMainApi("dev.icerock.moko:resources-compose:0.20.0")
69+
commonTestImplementation("dev.icerock.moko:resources-test:0.20.0")
7070
}
7171
7272
multiplatformResources {
@@ -135,6 +135,18 @@ you also need to pass extra properties:
135135
-Pkotlin.native.cocoapods.configuration=$CONFIGURATION
136136
```
137137

138+
### iOS executable
139+
When you use `executable` kotlin target you should add custom build phase to xcode, after kotlin
140+
compilation:
141+
```shell
142+
"$SRCROOT/../gradlew" -p "$SRCROOT/../" :shared:copyResourcesDebugExecutableIosSimulatorArm64 \
143+
-Pmoko.resources.BUILT_PRODUCTS_DIR=$BUILT_PRODUCTS_DIR \
144+
-Pmoko.resources.CONTENTS_FOLDER_PATH=$CONTENTS_FOLDER_PATH
145+
```
146+
`copyResourcesDebugExecutableIosSimulatorArm64` should be configured depends on target.
147+
148+
Configured sample you can see in `sample/ios-app` - `TestKotlinApp` target
149+
138150
## Usage
139151
### Example 1 - simple localization string
140152
The first step is a create a file `strings.xml` in `commonMain/resources/MR/base` with the following content:

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ robolectricVersion = "4.7.3"
3636
mokoGraphicsVersion = "0.9.0"
3737
mokoParcelizeVersion = "0.8.0"
3838
mokoTestVersion = "0.5.0"
39-
mokoResourcesVersion = "0.19.1"
40-
mokoMultiplatformPluginVersion = "0.13.0"
39+
mokoResourcesVersion = "0.20.0"
40+
mokoMultiplatformPluginVersion = "0.14.1"
4141

4242
[libraries]
4343
# kotlinx

resources-generator/src/main/kotlin/dev/icerock/gradle/generator/apple/AppleMRGenerator.kt

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,21 @@ import com.squareup.kotlinpoet.STRING
1212
import com.squareup.kotlinpoet.TypeSpec
1313
import dev.icerock.gradle.MultiplatformResourcesPluginExtension
1414
import dev.icerock.gradle.generator.MRGenerator
15+
import dev.icerock.gradle.tasks.CopyExecutableResourcesToApp
1516
import dev.icerock.gradle.tasks.CopyFrameworkResourcesToAppEntryPointTask
1617
import dev.icerock.gradle.tasks.CopyFrameworkResourcesToAppTask
1718
import dev.icerock.gradle.utils.calculateResourcesHash
1819
import org.gradle.api.Action
1920
import org.gradle.api.Project
2021
import org.gradle.api.Task
2122
import org.gradle.api.plugins.ExtensionAware
23+
import org.gradle.kotlin.dsl.create
2224
import org.gradle.kotlin.dsl.findByType
2325
import org.gradle.kotlin.dsl.getByType
2426
import org.gradle.kotlin.dsl.withType
2527
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
2628
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension
29+
import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractExecutable
2730
import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation
2831
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
2932
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
@@ -90,6 +93,7 @@ class AppleMRGenerator(
9093
)
9194

9295
override fun apply(generationTask: Task, project: Project) {
96+
createCopyResourcesToAppTask(project)
9397
setupKLibResources(generationTask)
9498
setupFrameworkResources()
9599
setupTestsResources()
@@ -183,7 +187,6 @@ class AppleMRGenerator(
183187
linkTask.doLast(object : Action<Task> {
184188
override fun execute(task: Task) {
185189
task as KotlinNativeLink
186-
187190
copyKlibsResourcesIntoFramework(task)
188191
}
189192
})
@@ -234,14 +237,37 @@ $linkTask produces static framework, Xcode should have Build Phase with copyFram
234237
target = outputDir,
235238
overwrite = true
236239
)
237-
} catch (exc: kotlin.io.NoSuchFileException) {
240+
} catch (exc: NoSuchFileException) {
238241
project.logger.info("resources in $inputFile not found")
239242
} catch (exc: java.nio.file.NoSuchFileException) {
240243
project.logger.info("resources in $inputFile not found (empty lib)")
241244
}
242245
}
243246
}
244247

248+
private fun createCopyResourcesToAppTask(project: Project) {
249+
project.tasks.withType<KotlinNativeLink>()
250+
.matching { linkTask -> linkTask.binary is AbstractExecutable }
251+
.all { linkTask ->
252+
val copyTaskName = linkTask.name.replace("link", "copyResources")
253+
254+
if (linkTask.project.tasks.any { it.name == copyTaskName }) return@all
255+
256+
project.files(linkTask.intermediateLibrary)
257+
258+
val copyResources = linkTask.project.tasks
259+
.create(copyTaskName, CopyExecutableResourcesToApp::class) {
260+
val libraries = linkTask.libraries
261+
.plus(project.files(linkTask.intermediateLibrary))
262+
.filter { library -> library.extension == "klib" }
263+
.filter(File::exists)
264+
265+
it.libraries = libraries
266+
}
267+
copyResources.dependsOn(linkTask)
268+
}
269+
}
270+
245271
private fun createCopyFrameworkResourcesTask(linkTask: KotlinNativeLink) {
246272
val framework = linkTask.binary as Framework
247273
val project = linkTask.project
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright 2022 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.icerock.gradle.tasks
6+
7+
import org.gradle.api.DefaultTask
8+
import org.gradle.api.file.FileCollection
9+
import org.gradle.api.tasks.Internal
10+
import org.gradle.api.tasks.TaskAction
11+
import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutImpl
12+
import java.io.File
13+
import java.io.FileFilter
14+
15+
open class CopyExecutableResourcesToApp : DefaultTask() {
16+
@get:Internal
17+
lateinit var libraries: FileCollection
18+
19+
@TaskAction
20+
fun copyResources() {
21+
val buildProductsDir =
22+
File(project.property("moko.resources.BUILT_PRODUCTS_DIR") as String)
23+
val contentsFolderPath =
24+
project.property("moko.resources.CONTENTS_FOLDER_PATH") as String
25+
26+
val outputDir = File(buildProductsDir, contentsFolderPath)
27+
28+
libraries
29+
.filter { it.extension == "klib" }
30+
.filter { it.exists() }
31+
.forEach { inputFile ->
32+
val klibKonan = org.jetbrains.kotlin.konan.file.File(inputFile.path)
33+
val klib = KotlinLibraryLayoutImpl(klib = klibKonan, component = "default")
34+
val layout = klib.extractingToTemp
35+
36+
// extracting bundles
37+
layout
38+
.resourcesDir
39+
.absolutePath
40+
.let(::File)
41+
.listFiles(FileFilter { it.extension == "bundle" })
42+
// copying bundles to app
43+
?.forEach {
44+
logger.info("${it.absolutePath} copying to $outputDir")
45+
it.copyRecursively(target = File(outputDir, it.name), overwrite = true)
46+
}
47+
}
48+
}
49+
}

sample/ios-app/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ EXTERNAL SOURCES:
1414

1515
SPEC CHECKSUMS:
1616
mpp_hierarhical: 8ea2466bf26a2cf59d466e44ab634b755c435f07
17-
MultiPlatformLibrary: b3a7ad5042414b79af4b469037a116eae383fb08
17+
MultiPlatformLibrary: 2a9f43df7bd018c32611a2087c1e2ef74847394c
1818

1919
PODFILE CHECKSUM: f0c3cdabcc5ee37fe65b6ecd54b1f04017dbea93
2020

21-
COCOAPODS: 1.11.2
21+
COCOAPODS: 1.11.3
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"colors" : [
3+
{
4+
"idiom" : "universal"
5+
}
6+
],
7+
"info" : {
8+
"author" : "xcode",
9+
"version" : 1
10+
}
11+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
{
2+
"images" : [
3+
{
4+
"idiom" : "iphone",
5+
"scale" : "2x",
6+
"size" : "20x20"
7+
},
8+
{
9+
"idiom" : "iphone",
10+
"scale" : "3x",
11+
"size" : "20x20"
12+
},
13+
{
14+
"idiom" : "iphone",
15+
"scale" : "2x",
16+
"size" : "29x29"
17+
},
18+
{
19+
"idiom" : "iphone",
20+
"scale" : "3x",
21+
"size" : "29x29"
22+
},
23+
{
24+
"idiom" : "iphone",
25+
"scale" : "2x",
26+
"size" : "40x40"
27+
},
28+
{
29+
"idiom" : "iphone",
30+
"scale" : "3x",
31+
"size" : "40x40"
32+
},
33+
{
34+
"idiom" : "iphone",
35+
"scale" : "2x",
36+
"size" : "60x60"
37+
},
38+
{
39+
"idiom" : "iphone",
40+
"scale" : "3x",
41+
"size" : "60x60"
42+
},
43+
{
44+
"idiom" : "ipad",
45+
"scale" : "1x",
46+
"size" : "20x20"
47+
},
48+
{
49+
"idiom" : "ipad",
50+
"scale" : "2x",
51+
"size" : "20x20"
52+
},
53+
{
54+
"idiom" : "ipad",
55+
"scale" : "1x",
56+
"size" : "29x29"
57+
},
58+
{
59+
"idiom" : "ipad",
60+
"scale" : "2x",
61+
"size" : "29x29"
62+
},
63+
{
64+
"idiom" : "ipad",
65+
"scale" : "1x",
66+
"size" : "40x40"
67+
},
68+
{
69+
"idiom" : "ipad",
70+
"scale" : "2x",
71+
"size" : "40x40"
72+
},
73+
{
74+
"idiom" : "ipad",
75+
"scale" : "1x",
76+
"size" : "76x76"
77+
},
78+
{
79+
"idiom" : "ipad",
80+
"scale" : "2x",
81+
"size" : "76x76"
82+
},
83+
{
84+
"idiom" : "ipad",
85+
"scale" : "2x",
86+
"size" : "83.5x83.5"
87+
},
88+
{
89+
"idiom" : "ios-marketing",
90+
"scale" : "1x",
91+
"size" : "1024x1024"
92+
}
93+
],
94+
"info" : {
95+
"author" : "xcode",
96+
"version" : 1
97+
}
98+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"info" : {
3+
"author" : "xcode",
4+
"version" : 1
5+
}
6+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
3+
<device id="retina6_1" orientation="portrait" appearance="light"/>
4+
<dependencies>
5+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19519"/>
6+
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
7+
<capability name="System colors in document resources" minToolsVersion="11.0"/>
8+
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
9+
</dependencies>
10+
<scenes>
11+
<!--View Controller-->
12+
<scene sceneID="EHf-IW-A2E">
13+
<objects>
14+
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
15+
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
16+
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
17+
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
18+
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
19+
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
20+
</view>
21+
</viewController>
22+
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
23+
</objects>
24+
<point key="canvasLocation" x="53" y="375"/>
25+
</scene>
26+
</scenes>
27+
<resources>
28+
<systemColor name="systemBackgroundColor">
29+
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
30+
</systemColor>
31+
</resources>
32+
</document>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict/>
5+
</plist>

0 commit comments

Comments
 (0)