【KMM】KDoctor って生きてるの?

公式にこんなの書いてるけど。

kdoctor

👉 Set up an environment | Kotlin hatena-bookmark


❯ kdoctor                       
[v] System                                           
    OS: macOS (12.6)
    CPU: Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
[v] Java
    Java (openjdk version "11.0.13" 2021-10-19)
    Location: /Users/maochanz/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/213.7172.25.2113.9014738/Android Studio.app/Contents/jre/Contents/Home/bin/java
    
    JAVA_HOME=/Users/maochanz/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/213.7172.25.2113.9014738/Android Studio.app/Contents/jre/Contents/Home
    
    * Note that, by default, Xcode uses Java environment returned by /usr/libexec/java_home:
      /usr/local/Cellar/openjdk@11/11.0.16.1_1/libexec/openjdk.jdk/Contents/Home
      It does not match current JAVA_HOME environment variable:
      /Users/maochanz/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/213.7172.25.2113.9014738/Android Studio.app/Contents/jre/Contents/Home
          Set JAVA_HOME in XCode -> Preferences -> Locations -> Custom Paths to
          /Users/maochanz/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/213.7172.25.2113.9014738/Android Studio.app/Contents/jre/Contents/Home
    
    * Note that, by default, Android Studio uses bundled JDK for Gradle tasks execution.
          Gradle JDK can be configured in Android Studio Preferences under Build, Execution, Deployment -> Build Tools -> Gradle section
    
[x] Android Studio
    * Android Studio (2021.3)
      Location: /Users/maochanz/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/213.7172.25.2113.9014738/Android Studio.app
      Bundled Java: openjdk 11.0.13 2021-10-19
      Kotlin Plugin: 213-1.7.10-release-for-android-studio-AS6777.52
      Kotlin Multiplatform Mobile Plugin: not installed
          Install Kotlin Multiplatform Mobile plugin - https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform-mobile
    
[v] Xcode
    Xcode (14.0.1)
    Location: /Applications/Xcode.app
    
[x] Cocoapods
    ruby (ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x86_64-darwin21])
    
    ruby gems (3.3.11)
    
    cocoapods (1.11.3)
    
    * cocoapods-generate plugin not found
          Get cocoapods-generate from https://github.com/square/cocoapods-generate#installation
    
Failures: 2
KDoctor has diagnosed one or more problems while checking your environment.
Please check the output for problem description and possible solutions.

Failures: 2 ですけど!!

👉 Kotlin/kdoctor: Environment analysis tool hatena-bookmark

 

■ JAVA_HOME

Homebrew で OpenJDK11 最新を入れておく。

👉 Mac に Homebrew で OpenJDK11 を インストール する hatena-bookmark


export JAVA_HOME=$(/usr/libexec/java_home -v11)
export PATH="$JAVA_HOME/bin:$PATH"


❯ java -version
openjdk version "11.0.16.1" 2022-08-12
OpenJDK Runtime Environment Homebrew (build 11.0.16.1+0)
OpenJDK 64-Bit Server VM Homebrew (build 11.0.16.1+0, mixed mode)

❯ javac -version
javac 11.0.16.1

❯ which java
/usr/local/Cellar/openjdk@11/11.0.16.1_1/libexec/openjdk.jdk/Contents/Home/bin/java

❯ which javac
/usr/local/Cellar/openjdk@11/11.0.16.1_1/libexec/openjdk.jdk/Contents/Home/bin/javac

❯ ./gradlew --version

------------------------------------------------------------
Gradle 7.5.1
------------------------------------------------------------

Build time:   2022-08-05 21:17:56 UTC
Revision:     d1daa0cbf1a0103000b71484e1dbfe096e095918

Kotlin:       1.6.21
Groovy:       3.0.10
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          11.0.16.1 (Homebrew 11.0.16.1+0)
OS:           Mac OS X 12.6 x86_64

AndroidStudio 内の設定で選択肢から指定するだけでいい。

JAVA_HOME

👉 AndroidStudio 利用する Java (JDK) の選択・設定の方法 hatena-bookmark

 

■ Kotlin Multiplatform Mobile Plugin

KMM プラグインをインストールしても、ずっと


Kotlin Multiplatform Mobile Plugin: not installed

のままです。

どうやら、JetBrains ToolBox で Android Studio を使ってる場合の現象のようです。

KDoctor が KMM プラグインを見つけられないようです。

Android Studio: Cannot detect installed Kotlin Multiplatform Mobile Plugin
👉 Android Studio: Cannot detect installed Kotlin Multiplatform Mobile Plugin · Issue #25 · Kotlin/kdoctor hatena-bookmark

 

■ cocoapods-generate


~/AndroidStudioProjects/KMM main
❯ gem 'cocoapods-generate'
ERROR:  While executing gem ... (Gem::UnknownCommandError)
    Unknown command cocoapods-generate

~/AndroidStudioProjects/KMM main
❯ gem install cocoapods-generate
ERROR:  While executing gem ... (Errno::EACCES)
    Permission denied @ dir_s_mkdir - /usr/local/lib/ruby/gems/2.7.0/gems/cocoapods-disable-podfile-validations-0.1.1

❯ pod env --verbose
  CDN: trunk Relative path: CocoaPods-version.yml exists! Returning local because checking is only performed in repo update

### Stack

```
   CocoaPods : 1.11.3
        Ruby : ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x86_64-darwin21]
    RubyGems : 3.3.11
        Host : macOS 12.6 (21G115)
       Xcode : 14.0.1 (14A400)
         Git : git version 2.33.0
Ruby lib dir : /usr/local/Cellar/[email protected]/2.7.6_1/lib
Repositories : trunk - CDN - https://cdn.cocoapods.org/
```

### Installation Source

```
Executable Path: /usr/local/bin/pod
```

### Plugins

```
cocoapods-deintegrate : 1.0.5
cocoapods-plugins     : 1.0.0
cocoapods-search      : 1.0.1
cocoapods-trunk       : 1.6.0
cocoapods-try         : 1.2.0

```

Kotlin 1.7.0 以降は、


sudo gem install cocoapods

だけでいいんじゃね?

Set up an environment to work with CocoaPods

👉 CocoaPods overview and setup | Kotlin hatena-bookmark

 

■ まとめ

GitHub リポジトリを見てる限り、

KDoctor is a command-line tool that helps to set up the environment for Kotlin Multiplatform Mobile app development.
最終更新日時、

古すぎん?

生きてないのかな、KDoctor。

 

■ バージョン 0.0.5 公開 : 2022-12-04 追記

0.0.5 が公開されています。

正常に診断できるようになってます!!

--verbose で実行すると状態の詳細が分かりやすいです。


❯ kdoctor -h       
Usage: kdoctor options_list
Options: 
    --version -> print KDoctor version 
    --verbose, -v -> print extended information 
    --debug -> debug mode 
    --help, -h -> Usage info


👉 Kotlin/kdoctor: Environment analysis tool hatena-bookmark
👉 CocoaPods/CocoaPods: The Cocoa Dependency Manager. hatena-bookmark
👉 square/cocoapods-generate: A CocoaPods plugin that allows you to easily generate a workspace from a podspec. hatena-bookmark

👉 テキストアニメーションで Progress Indicator hatena-bookmark


Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException

build 失敗して出ますよね。

意味は、

設定しているリポジトリにそのモジュールのそのバージョンがないよ。

ということです。

今、こういうの出ました。


Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find app.cash.sqldelight:android-paging3-extensions:2.0.0-alpha03.
Searched in the following locations:
  - https://dl.google.com/dl/android/maven2/app/cash/sqldelight/android-paging3-extensions/2.0.0-alpha03/android-paging3-extensions-2.0.0-alpha03.pom
  - https://repo.maven.apache.org/maven2/app/cash/sqldelight/android-paging3-extensions/2.0.0-alpha03/android-paging3-extensions-2.0.0-alpha03.pom

エラーの https から始まるリンクから「バージョン」を含む文字列までを省いてブラウザでアクセスします。

👉 https://dl.google.com/dl/android/maven2/app/cash/sqldelight/android-paging3-extensions/hatena-bookmark

👉 https://repo.maven.apache.org/maven2/app/cash/sqldelight/android-paging3-extensions/hatena-bookmark

maven central にある、android-paging3-extensions の最新バージョンは、「2.0.0-alpha01」ですね!

build.glade のバージョンを変更すれば通りますね!

 

まとめ


Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException

が出たときは、build.gradle に設定したリポジトリに、そのバージョンが存在しません。エラーメッセージそのままですね!

ほぼ、利用してるリポジトリは以下2つのリポジトリであることが多いでしょう。


repositories {
  google()
  mavenCentral()
}

以下の2つをブラウザにブックマークしておくといいですね。

👉 Google's Maven Repository hatena-bookmark
👉 Maven Central Repository Search hatena-bookmark


Kotlin スコープ関数 の上手な使い分け その5 - run

kotlin scope function

 

■ run の便利な使い方 (公式)


public inline fun <T, R> T.run(block: T.() -> R): R {
  contract {...}
  return block()
}

Like let, run is another scoping function from the standard library. Basically, it does the same: executes a code block and returns its result. The difference is that inside run the object is accessed by this. This is useful when you want to call the object's methods rather than pass it as an argument.

let と同様、run も標準ライブラリのスコープ関数です。基本的には、コードブロックを実行し、その結果を返すという点では同じです。違いは、runの内部でオブジェクトにアクセスするのがthisであることです。これは、オブジェクトを引数として渡すのではなく、そのオブジェクトのメソッドを呼び出したい場合に便利です。

Object configuration and computing the result

オブジェクトの構成と結果の算出


val service = MultiportService("https://example.kotlinlang.org", 80)
val result = service.run {
  port = 8080
  query(prepareRequest() + " to port $port")
}

 

■ 非拡張 run

上記の T.run(): R と違って非拡張関数の run もあります。


public inline fun <R> run(block: () -> R): R {
  contract {...}
  return block()
}

Running statements where an expression is required

式が必要な記述の実行

If-not-null-else shorthand

if-not-null-elseの略記法


val files = File("Test").listFiles()

println(files?.size ?: "empty") 

val filesSize = files?.size ?: run {
  // ...
}
println(filesSize)

?.let と組み合わせての利用が多いです。


navigationCommand.route?.let {
  popBackStack(it, false)
} ?: run {
  navigateUp()
}

プロパティでの実行。


private val isConversionAvailable: Boolean = run {
  val expressionType = element.analyze(BodyResolveMode.PARTIAL).getType(element)
  expressionType != null && expressionType != type &&
    expressionType.isSignedOrUnsignedNumberType() && type.isSignedOrUnsignedNumberType()
}

👉 Kotlin Examples: Learn Kotlin Programming By Example hatena-bookmark
👉 Scope functions | Kotlin hatena-bookmark
👉 Idioms | Kotlin hatena-bookmark

 

■ まとめ

「run」は「ブロック内を実行する」という意味合いが強いので、直感的に「let」と使い分けてもいいかもしれません。

👉 Kotlin スコープ関数 の上手な使い分け その1 - apply hatena-bookmark
👉 Kotlin スコープ関数 の上手な使い分け その2 - also hatena-bookmark
👉 Kotlin スコープ関数 の上手な使い分け その3 - with hatena-bookmark
👉 Kotlin スコープ関数 の上手な使い分け その4 - let hatena-bookmark
👉 Kotlin スコープ関数 の上手な使い分け その5 - run hatena-bookmark