React Nativeでのクラッシュレポートについて調べてみた

Crash Reporting for React Native apps · Issue #5378 · facebook/react-native · GitHub

雑感としてはSentryがよさそうな雰囲気。App Centerもいいかもしれない。

Crashlyticsとそのラッパー

iOS, Androidのネイティブのクラッシュレポートの定番はCrashlytics(無料だし)だが、ソースマップ適用したスタックトレースを表示したりできるわけではないので、React Native側のJSのエラーレポートには力不足だと思う。

その他

追記

Twitterで情報をもらってVisual Studio App Centerのことを思い出した!これもReact Nativeに対応している(ソースマップ対応)。

App Center Crash Reporting for React Native - Visual Studio App Center | Microsoft Docs

CodePushもやっているから納得。

Pipelineを使うJenkinsで、グローバルの設定でPATHを付け加えたい場合はPATH+EXTRAを使用する

こんばんは。Jenkinsと戯れている今日この頃です。

キー: PATH
値: /usr/local/bin:$PATH

ではなくて、

キー: PATH+EXTRA
値: /usr/local/bin

とする必要がある。こちらからは以上です。

swift-llvmがLLVM 6.0に追従した模様

これでSwiftのWebAssembly対応もちょっと捗るのかもしれない?

参考: https://github.com/kripken/emscripten/issues/2427#issuecomment-372025515

MintでSwiftPM製のCLIツールを管理する

Swift界隈では、Swift Package Manager (SwiftPM) で作られたCLIツールが増えつつあって、それのインストールやバージョン管理をどうしようかという問題がある。一部のツールはHomebrewやCocoaPodsでの配布もしているけど、全ては賄えない。となると各ツールのリポジトリをチェックアウトして$ swift buildしてパス通った箇所にコピーするなどしないといけないけど流石にそれは面倒。

というところで https://github.com/yonaskolb/Mint を使うとその辺の管理が楽になりそう(Mint自体はHomebrewでインストールできる)。

$ mint run yonaskolb/XcodeGen@1.2.4 xcodegen --spec spec.yml # pass some arguments
$ mint install yonaskolb/XcodeGen@1.2.4 --global=false # installs a certain version but not globally
$ mint install yonaskolb/XcodeGen # install newest tag
$ mint run yonaskolb/XcodeGen@1.2.4 # run 1.2.4
$ mint run XcodeGen # use newest tag and find XcodeGen in installed tools

$ mint install/usr/local/binにもリンクしてくれるようなので便利そう。

参考: Swift Package Managerを使って作成したコマンドをMintでインストールする

SwiftでCLIツールを書くためのArgument Parser

SwiftでCLIツールを書く時のArgument Parser(引数やサブコマンドをいい感じに解釈してくれるやつ)の選択肢を書き連ねておきます。これら以外の良い選択肢をご存知の方はぜひ教えてください 🙏

Cirrus CIというCIサービスを知った

(当然)macOSではないのでXcodeは動かせないけど、Swift on LinuxのCIには使えるかもしれない。

Trailing Closureを禁止する

SwiftLint 0.22で追加された multiple_closures_with_trailing_closure というルールをご存知でしょうか。これは次のような複数のクロージャを引数に取るAPIを使用する時に、最後の引数のクロージャTrailing Closureとして渡すことを警告するというルールです。

func fetch(id: Int, success: () -> Void, failure: (Error) -> Void) { ... }

// NG
fetch(
    id: 12345, 
    success: { print("success") }
) { error in
    print("error: \(error)"
}

// OK
fetch(
    id: 12345, 
    success: { print("success") }, 
    failure: { error in print("error: \(error)")}
)

こうしたAPIでは最後のクロージャだけ引数ラベルが落ちてしまうと、各引数の間の対称性がなくなってしまってコードが読みにくくなってしまいそうです。普段よく使うであろうAPIとしては UIView.animate(withDuration:animations:completion:) が挙げられると思います。

// With trailing closure
UIView.animate(
    withDuration: 0.3,
    animations: { ... }
) { finished in
    ...
}

// Without trailing closure
UIView.animate(
    withDuration: 0.3,
    animations: { ... },
    completion: { finished in ... }
)

さて、Lintで利用者側がこうした使用方法を警告・禁止できるとしても、ライブラリの提供者側で禁止することはできないでしょうか。以下に1つのアイデアを示してみようと思います。

func fetch(id: Int, success: () -> Void, failure: (Error) -> Void, _ tcDisabler: () = ()) { ... }

考え方としては単純で、クロージャが最後の引数にならないようにしてあげるだけですね。意味のない値をデフォルト引数として設定しておくことで、利用者サイドは特に気にせずに利用できるはずです。引数名や値に考える余地はありそうですが、他にもいい手段がないか、ご意見お待ちしています。