package main import ( "flag" "log/slog" "os" "path/filepath" "kra/internal/conf" "kra/internal/worker" "kra/pkg/logging" "github.com/go-kratos/kratos/v3" "github.com/go-kratos/kratos/v3/config" "github.com/go-kratos/kratos/v3/config/file" "github.com/go-kratos/kratos/v3/log" kratoshttp "github.com/go-kratos/kratos/v3/transport/http" _ "go.uber.org/automaxprocs" ) // go build -ldflags "-X main.Version=x.y.z" var ( // Name is the name of the compiled software. Name string // Version is the version of the compiled software. Version string // flagconf is the config flag. flagconf string id, _ = os.Hostname() ) func init() { flag.StringVar(&flagconf, "conf", "../../configs", "config path, eg: -conf config.yaml") } func newApp(logger *slog.Logger, hs *kratoshttp.Server, scheduler *worker.TaskScheduler) *kratos.App { return kratos.New( kratos.ID(id), kratos.Name(Name), kratos.Version(Version), kratos.Metadata(map[string]string{}), kratos.Logger(logger), kratos.Server( hs, scheduler, ), ) } func main() { flag.Parse() logger, closeLogger := logging.NewZapLogger("logs", "application.log", slog.String("service.id", id), slog.String("service.name", Name), slog.String("service.version", Version), ) defer closeLogger() log.SetDefault(logger) c := config.New( config.WithSource( file.NewSource(flagconf), ), ) defer c.Close() if err := c.Load(); err != nil { panic(err) } var bc conf.Bootstrap if err := c.Scan(&bc); err != nil { panic(err) } if bc.Admin != nil { bc.Admin.ConfigPath = flagconf if info, err := os.Stat(flagconf); err == nil && info.IsDir() { bc.Admin.ConfigPath = filepath.Join(flagconf, "config.yaml") } } app, cleanup, err := wireApp(bc.Server, bc.Data, bc.Admin, logger) if err != nil { panic(err) } defer cleanup() // start and wait for stop signal if err := app.Run(); err != nil { panic(err) } }