Closed17

entのschemaからのコード生成の仕組みを把握する

podhmopodhmo

entのschemaの生成について

以下の様なコードから始まる( ent init で生成されたものを利用する )。


package schema

import "entgo.io/ent"

// User holds the schema definition for the User entity.
type User struct {
    ent.Schema
}


// Fields of the User.
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.Int("age").
            Positive(),
        field.String("name").
            Default("unknown"),
    }
}

// Edges of the User.
func (User) Edges() []ent.Edge {
    return nil
}
podhmopodhmo

schemaからのコード生成は go generate ./ent で実行される

具体的には https://github.com/ent/ent/blob/master/examples/start/ent/generate.go

// Copyright 2019-present Facebook Inc. All rights reserved.
// This source code is licensed under the Apache 2.0 license found
// in the LICENSE file in the root directory of this source tree.

package ent

//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate --header "// Copyright 2019-present Facebook Inc. All rights reserved.\n// This source code is licensed under the Apache 2.0 license found\n// in the LICENSE file in the root directory of this source tree.\n\n// Code generated by ent, DO NOT EDIT." ./schema
podhmopodhmo

entc.Generate()の挙動について

podhmopodhmo

entc.Generate()の定義

https://github.com/ent/ent/blob/ee7a50bc4804539359499bffccc7118766d3e8e8/entc/entc.go#L55

実際の実装はgenerate()の方。LoadGraph()してgraph.Gen()。

https://github.com/ent/ent/blob/ee7a50bc4804539359499bffccc7118766d3e8e8/entc/entc.go#L376-L390

生成の仕組みではなく定義の仕組みが知りたいので見るべきはLoadGraph()

https://github.com/ent/ent/blob/ee7a50bc4804539359499bffccc7118766d3e8e8/entc/entc.go#L29-L41

entgo.io/ent/entc/genの方を覗けば良い。

podhmopodhmo

entのschemaで定義できるメソッド

これは、GenerateSchema()を覗いても良いし、pkg.go.devを覗いても良い。

podhmopodhmo

つまり、

  • 自由度が制限されたbuilderを各種setterとして扱い、これはString()みたいな関数がfactoryとして機能し、descriptorはmetadata
  • 定義されたschemaを実行するmain.goを生成し、それをgo runで実行、metadataはJSONとして転写される
  • 転写された文字列をJSONとして扱いschemaの設定値を得る。 コード生成自体はこの設定値を利用していい感じに生成
このスクラップは2023/07/03にクローズされました