Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pkl/2024-04-17-llt31

 Pkl/2024-04-17-llt31

社内のLTイベント「えるLT Vol.31 オンライン」で発表した資料です

Satoshi SAKAO

April 17, 2024
Tweet

More Decks by Satoshi SAKAO

Other Decks in Programming

Transcript

  1. 話すひと 2 🏢 インフォコム株式会社 サービスマネジメント室 👨🔧 ソフトウェアエンジニア 🛠 Node.js /

    AWS / IoT / iOS (Swift) / Linux 💖 猫,B'z,テクテクライフ(ランク: 29) Satoshi SAKAO @ottijp.com 𝕏 @ottijp
  2. Pkl • 「ぴっくる」 • OSS (since 2024-02-01) by Apple •

    Con fi guration as Code • 静的設定ファイル < Pkl < プログラミング言語 4
  3. ユースケース 5 Pkl JSON YAML XML Pkl ••• > pkl

    eval ••• > pkl-gen-* App 1. 静的設定ファイルの生成 2. 設定ファイルとして利用 source code
  4. 1. 静的設定ファイルの生成 6 host = "localhost" port = 80 api

    { url = "https://example.com/api/hoge" token = "secret" } host: localhost port: 80 api: url: https://example.com/api/hoge token: secret <?xml version="1.0" encoding="UTF-8"?> <root> <host>localhost</host> <port>80</port> <api> <url>https://example.com/api/hoge</url> <token>secret</token> </api> </root> example.pkl pkl eval -f yaml example.pkl pkl eval -f xml example.pkl 再利用,テンプレート,抽象化による 
 複雑さの低減と保守性の向上
  5. 2. 設定ファイルとして利用 7 host: String port: UInt8 api: Api class

    Api { url: String token: String } // Code generated from Pkl module `example01-template`. DO NOT EDIT. import PklSwift public enum example01Template {} extension example01Template { public struct Module: PklRegisteredType, Decodable, Hashable { public static var registeredIdentifier: String = "example01-template" public var host: String pkl-gen-swift template.pkl App ビルド ランタイムに読込 template.pkl 言語とのバインディングによる 
 簡単さと安全さの実現 host = "localhost" port = 80 api { url = "https://example.com/api/hoge" token = "secret" } example.pkl 準拠(amends)
  6. データタイプ(一部) 8 // string name = "Rei" // number age

    = 5 // boolean cute = true // object food { name = "ROYAL CANIN" price = 5470 } // class (typed object) class Cat { name: String age: UInt8 } rei = (Cat) { name = "Rei" age = 5 } // Duration duration = 28.d // DataSize size = 42.kb // union env: "dev" | "prod" = "prod" // list toys = new Listing { "けりぐるみ" "ねこじゃらし" "爪とぎ" } // map hospitals = new Mapping { ["primary"] { doctor = "Doctor X" tel = "03-xxxx-xxxx" } ["secondary"] { doctor = "Doctor Y" tel = "03-yyyy-yyyy" } }
  7. 式(一部) 9 // if age = 20 type = if

    (age >= 20) "adult" else "child" // for ids = List(0, 1, 2) machines { for (_id in ids) { new { name = "machine_\(_id)" } } } // type test floor = 5 isNum = floor is Number // Regex postCode = "100-0001" pcRe = Regex(#"[0-9]{3}-?[0-9]{4}"#) isPCValid = postCode.matches(pcRe) // spread syntax entry1 { type = "book" } entry2 { ...entry1 }
  8. テンプレート 10 module Configuration name: String(length > 0) email: String(isEmailValid)

    local isEmailValid = (s) -> s.matches(Regex(#".+@.+"#)) emailSub: String(isEmailValid, this != email) amends "./Configuration.pkl" name = "Hoge" email = "[email protected]" emailSub = "[email protected]" Configuration.pkl me.pkl
  9. バリデーション(型制約) 11 module Configuration name: String(length > 0) email: String(isEmailValid)

    local isEmailValid = (s) -> s.matches(Regex(#".+@.+"#)) emailSub: String(isEmailValid, this != email) amends "./Configuration.pkl" name = "Hoge" email = "[email protected]" emailSub = "[email protected]" Configuration.pkl me.pkl
  10. 制約に違反している場合 12 $ pkl eval me.pkl –– Pkl Error ––

    Type constraint `this != email` violated. Value: "[email protected]" 6 | emailSub: String(isEmailValid, this != email) ^^^^^^^^^^^^^ at Configuration#emailSub (file:///Users/hoge/Dropbox/presentation/2024-04-17-llt31/learning/ example04/Configuration.pkl, line 6) 5 | emailSub = "[email protected]" ^^^^^^^^^^^^^^^^^^ at me#emailSub (file:///Users/hoge/Dropbox/presentation/2024-04-17-llt31/learning/example04/ me.pkl, line 5) 106 | text = renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.25.3/stdlib/ base.pkl#L106) amends "./Configuration.pkl" name = "Hoge" email = "[email protected]" emailSub = "[email protected]"
  11. 所感 • Con fi guration as Code便利 • デコードやバリデーションの実装の手間がなくなる •

    制約をテンプレート自体に表現でき,ドキュメント化できる • 設定ミスを予防できる • 公式のチュートリアルは説明不足でちょっとわかりにくい 13
  12. 提供されているツール • 実行可能ファイル (pkl) • macOS native, linux native, JAVA

    • YAML, JSON, XML, Property List, Jsonnet, Pcf, 
 (Java) Properties, Custom Renderers • ライブラリ,ソースファイル生成 (pkl-gen-*) • Java, Kotlin, Swift, and Go 15