app

package
v0.45.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 5, 2022 License: MIT Imports: 32 Imported by: 0

Documentation

Overview

Package app 提供可选的初始化程序的方法

NOTE: app 并不是必须的,只是为用户提供了一种简便的方式构建程序, 相对地也会有诸多限制,如果觉得不适用,可以直接使用 server.New 下的内容。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewOptions added in v0.45.0

func NewOptions(files *serialization.Files, f fs.FS, filename string) (*server.Options, error)

NewOptions 从配置文件初始化 server.Options 实例

files 指定从文件到对象的转换方法,同时用于配置文件和翻译内容; filename 用于指定项目的配置文件,根据扩展由 serialization.Files 负责在 f 查找文件加载;

NOTE: 并不是所有的 server.Options 字段都是可序列化的,部分字段,比如 RouterOptions 需要用户在返回的对象上,自行作修改,当然这些本身有默认值,不修改也可以正常使用。

Types

type App

type App struct {
	Name string // 程序名称

	Version string // 程序版本

	// 在运行服务之前对 Server 的额外操作
	//
	// 比如添加模块等。不可以为空。
	Init func(s *server.Server, action string) error

	// 在初始化 Server 之前对 Options 的二次处理
	//
	// 可以为空。
	Options func(*server.Options)

	// 命令行输出信息的通道
	//
	// 默认为 os.Stdout。
	Out io.Writer

	// 配置文件的加载器
	//
	// 为空则会给定一个能解析 .xml、.yaml、.yml 和 .json 文件的默认对象。
	// 该值可能会被 Options 操作所覆盖。
	Files *serialization.Files

	// 配置文件的文件名
	//
	// 仅是文件名,相对的路径由命令行 -f 指定。
	// 如果为空,则直接采用 &Options{} 初始化 Server 对象。
	ConfigFilename string

	// 本地化的相关操作接口
	//
	// 如果为空,则会被初始化一个空对象,该值可能会被 Options 操作所覆盖。
	Catalog *catalog.Builder

	// 触发退出的信号
	//
	// 为空(nil 或是 []) 表示没有。
	Signals []os.Signal

	// 通过信号触发退出时的等待时间
	SignalTimeout time.Duration
	// contains filtered or unexported fields
}

App 提供一种简单的命令行生成方式

生成的命令行带以下几个参数:

  • v 显示版本号;
  • h 显示帮助信息;
  • f 指定当前程序可读取的文件系统,这最终会转换成 Server.FS;
  • a 执行的动作,该值会传递给 Init,由用户根据 a 初始化方式;
  • s 以服务的形式运行;

本地化信息采用当前用户的默认语言, 由 github.com/issue9/localeutil.DetectUserLanguageTag 决定。 如果想让 App 支持本地化操作,最起码需要向 Catalog 注册命令行参数的本地化信息:

-v  show version
-h  show help
-f  set file system
-a  action
-s  run as server

对于 App 的初始化错误产生的 panic 信息是不支持本地的。

// 本地化命令行的帮助信息
builder := catalog.NewBuilder()
builder.SetString("show help", "显示帮助信息")
builder.SetString("show version", "显示版本信息")

app := &web.App{
    Name: "app",
    Version: "1.0.0",
    Init: func(s *Server) error {...},
    Catalog: builder,
}

app.Exec()

func (*App) Exec added in v0.45.0

func (cmd *App) Exec(args []string) error

Exec 执行命令行操作

args 表示命令行参数,一般为 os.Args,采用明确的参数传递,方便测试用。

type CORS added in v0.45.0

type CORS struct {
	// Origins 对应 Origin
	//
	// 可以是 *,如果包含了 *,那么其它的设置将不再启作用。
	// 此字段将被用于与请求头的 Origin 字段作验证,以确定是否放行该请求。
	//
	// 如果此值为空,表示不启用跨域的相关设置。
	Origins []string `yaml:"origins,omitempty" json:"origins,omitempty" xml:"origin,omitempty"`

	// AllowHeaders 对应 Access-Control-Allow-Headers
	//
	// 可以包含 *,表示可以是任意值,其它值将不再启作用。
	AllowHeaders []string `yaml:"allowHeaders,omitempty" json:"allowHeaders,omitempty" xml:"allowHeader,omitempty"`

	// ExposedHeaders 对应 Access-Control-Expose-Headers
	ExposedHeaders []string `yaml:"exposedHeaders,omitempty" json:"exposedHeaders,omitempty" xml:"exposedHeader,omitempty"`

	// MaxAge 对应 Access-Control-Max-Age
	//
	// 0 不输出该报头;
	// -1 表示禁用;
	// 其它 >= -1 的值正常输出数值;
	MaxAge int `yaml:"maxAge,omitempty" json:"maxAge,omitempty" xml:"maxAge,attr,omitempty"`

	// AllowCredentials 对应 Access-Control-Allow-Credentials
	AllowCredentials bool `yaml:"allowCredentials,omitempty" json:"allowCredentials,omitempty" xml:"allowCredentials,attr,omitempty"`
}

CORS 跨域设置

type Cache added in v0.45.0

type Cache struct {
	// 表示缓存的方式
	//
	// 目前支持以下几种试:
	// - memory 以内存作为缓存;
	// - memcached 以 memcached 作为缓存;
	// - redis 以 redis 作为缓存;
	// - file 以文件作为缓存;
	Type string `yaml:"type" json:"type" xml:"type,attr"`

	// 表示连接缓存服务器的参数
	//
	// - memory,此值为 time.Duration 格式的参数,用于表示执行回收的间隔;
	// - memcached,则为服务器列表,多个服务器,以分号作为分隔;
	// - redis,则为符合 Redis URI scheme 的字符串,可参考 https://www.iana.org/assignments/uri-schemes/prov/redis
	// - file,表示以半有分号分隔的参数列表,可以指定以下两个参数:
	//  - path 文件路径;
	//  - gc 执行回收的间隔,time.Duration 格式;
	DSN string `yaml:"dsn" json:"dsn" xml:"dsn"`
}

Cache 缓存的相关配置

type Certificate added in v0.45.0

type Certificate struct {
	Cert string `yaml:"cert,omitempty" json:"cert,omitempty" xml:"cert,omitempty"`
	Key  string `yaml:"key,omitempty" json:"key,omitempty" xml:"key,omitempty"`
}

Certificate 证书管理

type Config added in v0.45.0

type Config struct {
	XMLName struct{} `yaml:"-" json:"-" xml:"web"`

	// 指定默认语言
	//
	// 当客户端未指定 Accept-Language 时,会采用此值,
	// 如果为空,则会尝试当前用户的语言。
	Language string `yaml:"language,omitempty" json:"language,omitempty" xml:"language,attr,omitempty"`

	// 网站端口
	//
	// 格式与 net/http.Server.Addr 相同。可以为空,表示由 net/http.Server 确定其默认值。
	Port string `yaml:"port,omitempty" json:"port,omitempty" xml:"port,attr,omitempty"`

	// 路由的相关设置
	//
	// 提供了对全局路由的设置,但是用户依然可以通过 server.Server.MuxGroups().AddRouter 忽略这些设置项。
	Router *Router `yaml:"router,omitempty" json:"router,omitempty" xml:"router,omitempty"`

	// 与 HTTP 请求相关的设置项
	HTTP *HTTP `yaml:"http,omitempty" json:"http,omitempty" xml:"http,omitempty"`

	// 时区名称
	//
	// 可以是 Asia/Shanghai 等,具体可参考:
	// https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
	//
	// 为空和 Local(注意大小写) 值都会被初始化本地时间。
	Timezone string `yaml:"timezone,omitempty" json:"timezone,omitempty" xml:"timezone,omitempty"`

	// 指定缓存对象
	//
	// 如果为空,则会采用内存作为缓存对象。
	Cache *Cache `yaml:"cache,omitempty" json:"cache,omitempty" xml:"cache,omitempty"`

	// 日志初始化参数
	//
	// 如果为空,则初始化一个空日志,不会输出任何日志。
	Logs *config.Config `yaml:"logs,omitempty" json:"logs,omitempty" xml:"logs,omitempty"`
	// contains filtered or unexported fields
}

Config 配置内容

func (*Config) NewOptions added in v0.45.0

func (conf *Config) NewOptions(files *serialization.Files, fsys fs.FS) *server.Options

type Duration added in v0.45.0

type Duration time.Duration

Duration 封装 time.Duration 以实现对 JSON、XML 和 YAML 的解析

func (Duration) Duration added in v0.45.0

func (d Duration) Duration() time.Duration

Duration 转换成 time.Duration

func (Duration) MarshalText added in v0.45.0

func (d Duration) MarshalText() ([]byte, error)

MarshalText encoding.TextMarshaler 接口

func (*Duration) UnmarshalText added in v0.45.0

func (d *Duration) UnmarshalText(b []byte) error

UnmarshalText encoding.TextUnmarshaler 接口

type Error added in v0.45.0

type Error struct {
	Config  string      // 配置文件的路径
	Field   string      // 字段名
	Message interface{} // 错误信息
	Value   interface{} // 原始值
}

Error 表示配置内容字段错误

func (*Error) Error added in v0.45.0

func (err *Error) Error() string

func (*Error) LocaleString added in v0.45.0

func (err *Error) LocaleString(p *message.Printer) string

type HTTP added in v0.45.0

type HTTP struct {
	// 网站的域名证书
	//
	// 不能同时与 LetsEncrypt 生效
	Certificates []*Certificate `yaml:"certificates,omitempty" json:"certificates,omitempty" xml:"certificate,omitempty"`

	// 配置 Let's Encrypt 证书
	//
	// 不能同时与 Certificates 生效
	LetsEncrypt *LetsEncrypt `yaml:"letsEncrypt,omitempty" json:"letsEncrypt,omitempty" xml:"letsEncrypt,omitempty"`

	// 应用于 http.Server 的几个变量
	ReadTimeout       Duration `yaml:"readTimeout,omitempty" json:"readTimeout,omitempty" xml:"readTimeout,attr,omitempty"`
	WriteTimeout      Duration `yaml:"writeTimeout,omitempty" json:"writeTimeout,omitempty" xml:"writeTimeout,attr,omitempty"`
	IdleTimeout       Duration `yaml:"idleTimeout,omitempty" json:"idleTimeout,omitempty" xml:"idleTimeout,attr,omitempty"`
	ReadHeaderTimeout Duration `yaml:"readHeaderTimeout,omitempty" json:"readHeaderTimeout,omitempty" xml:"readHeaderTimeout,attr,omitempty"`
	MaxHeaderBytes    int      `yaml:"maxHeaderBytes,omitempty" json:"maxHeaderBytes,omitempty" xml:"maxHeaderBytes,attr,omitempty"`
	// contains filtered or unexported fields
}

HTTP 与 http 请求相关的设置

type LetsEncrypt added in v0.45.0

type LetsEncrypt struct {
	Domains []string `yaml:"domains" json:"domains" xml:"domains"`
	Cache   string   `yaml:"cache" json:"cache" xml:"cache"`
	Email   string   `yaml:"email,omitempty" json:"email,omitempty" xml:"email,omitempty"`

	// 定义提早几天开始续订,如果为 0 表示提早 30 天。
	RenewBefore uint `yaml:"renewBefore,omitempty" json:"renewBefore,omitempty" xml:"renewBefore,attr,omitempty"`
}

LetsEncrypt Let's Encrypt 的相关设置

type Router added in v0.45.0

type Router struct {
	// 是否忽略大小写
	//
	// 如果为 true,那么客户请求的 URL 都将被转换为小写字符。
	// 不会影响服务端添加的路由项。
	CaseInsensitive bool `yaml:"caseInsensitive,omitempty" json:"caseInsensitive,omitempty" xml:"caseInsensitive,attr,omitempty"`

	// 跨域的相关设置
	//
	// 为空表示禁用跨域的相关设置。
	CORS *CORS `yaml:"cors,omitempty" json:"cors,omitempty" xml:"cors,omitempty"`
	// contains filtered or unexported fields
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL