Documentation
¶
Overview ¶
Package dev runs a web service's local development dependencies without Docker, and is the base for an app's own development command.
Index ¶
- Constants
- func FindConfig(dir string) (string, error)
- func LogPath(logs, service string) string
- func NewRootCmd(cfg Config) *cobra.Command
- func RequireConfig(root *cobra.Command, err error)
- func ResetStack(ctx context.Context, cfg Config, logger *slog.Logger) error
- func Up(ctx context.Context, cfg Config, logger *slog.Logger, out io.Writer, ...) error
- func WaitStack(ctx context.Context, cfg Config, timeout time.Duration) error
- type Config
- type ExitError
- type Postgres
- type S3
- type Service
- type Stack
Constants ¶
const ConfigFile = "dev.json"
ConfigFile is the name the dev command looks for, from the working directory up, so that `go -C tools tool dev` still finds the repository's.
Variables ¶
This section is empty.
Functions ¶
func FindConfig ¶
FindConfig returns the path of the nearest dev.json in dir or its parents.
func LogPath ¶ added in v0.4.0
LogPath is where a service's output from the latest run is kept, given the directory of a stack's logs.
func NewRootCmd ¶
NewRootCmd returns the dev command with the standard subcommands. An app with its own development tasks adds them with AddCommand.
func RequireConfig ¶ added in v0.6.1
RequireConfig makes every command but those that need no dev.json fail with err, for a dev run where no dev.json was found.
func ResetStack ¶
ResetStack deletes the stack's data. A server still running from the same directory is stopped first, since it would recreate files as they go.
Types ¶
type Config ¶
type Config struct {
// Name is the Postgres user, password and database, and required with
// Postgres. Tests get Name_test.
Name string `json:"name"`
// Root is the directory commands run in and relative paths resolve
// against. LoadConfig sets it to the config file's directory; otherwise
// it defaults to the working directory.
Root string `json:"-"`
// Dir keeps Postgres data, S3 objects and service logs between runs;
// defaults to .devstack.
Dir string `json:"dir,omitempty"`
// Env is set for every command. Values may name the stack:
// {postgres} and {postgres_test} are database URLs, {s3} the S3 endpoint.
Env map[string]string `json:"env,omitempty"`
// EnvFile is a dotenv file for personal settings and secrets, over Env
// and under the real environment. Defaults to .env; a missing file is
// skipped.
EnvFile string `json:"envFile,omitempty"`
// Ports names the ports the app's services listen on, with the one each
// prefers, such as {"server": 8080, "web": 5173}. dev gives each its
// preferred port when free and the next free one otherwise, and
// {port.<name>} stands for it in env, commands, url and health.
Ports map[string]int `json:"ports,omitempty"`
// Postgres runs when set.
Postgres *Postgres `json:"postgres,omitempty"`
// S3 runs when set.
S3 *S3 `json:"s3,omitempty"`
// Before lists commands run once, in order, before anything starts, such
// as generating files a server embeds. A failure stops dev.
Before [][]string `json:"before,omitempty"`
// Services run until dev stops: servers rebuilt when their sources
// change, and processes such as a Vite dev server.
Services []Service `json:"services,omitempty"`
// contains filtered or unexported fields
}
Config describes an app's local stack.
func LoadConfig ¶
LoadConfig reads a dev.json, rooted at its directory.
func (Config) DatabaseURL ¶
DatabaseURL is the URL of the app's database, or "" without Postgres.
func (Config) TestDatabaseURL ¶
TestDatabaseURL is the URL of the database for tests, or "" without Postgres.
type ExitError ¶ added in v0.6.0
type ExitError struct{ Code int }
ExitError carries a command's exit status out of `dev exec`, so that dev exits with it.
type Postgres ¶
type Postgres struct {
// Port defaults to 5432.
Port int `json:"port,omitempty"`
// Parameters are server settings, e.g. max_connections for test suites
// that open pools in parallel.
Parameters map[string]string `json:"parameters,omitempty"`
}
Postgres configures the local PostgreSQL server.
type S3 ¶
type S3 struct {
// Addr defaults to 127.0.0.1:8333.
Addr string `json:"addr,omitempty"`
}
S3 configures the local S3-compatible server.
type Service ¶ added in v0.4.0
type Service struct {
// Name prefixes its output, names its log, and selects it on the
// command line.
Name string `json:"name"`
// Dir is where its commands run, relative to the root.
Dir string `json:"dir,omitempty"`
// Build compiles a server, e.g. ["go", "build", "-o", "tmp/shop", "./cmd/shop"].
Build []string `json:"build,omitempty"`
// Run starts it, e.g. ["tmp/shop", "serve"] or ["pnpm", "--filter", "web", "dev"].
Run []string `json:"run"`
// Watch lists the directories, relative to Dir, whose changes rebuild a
// server; defaults to Dir. Hidden directories and node_modules are skipped.
Watch []string `json:"watch,omitempty"`
// Exclude names further directories to skip wherever they appear, such
// as the frontend or the build output.
Exclude []string `json:"exclude,omitempty"`
// Extensions are the file types that rebuild a server; defaults to .go.
Extensions []string `json:"extensions,omitempty"`
// Env is set for this service over the config's Env, with the same
// references to the stack.
Env map[string]string `json:"env,omitempty"`
// EnvFile is a dotenv file for this service, relative to Dir, over the
// config's EnvFile.
EnvFile string `json:"envFile,omitempty"`
// URL is where to open the service, such as http://localhost:8080. The
// interactive view links to it, and dev logs it once the service is up.
URL string `json:"url,omitempty"`
// Health is a URL that answers 2xx once the service can do its job, such
// as http://localhost:8080/readyz. With it, the service reads starting,
// then ready, or unhealthy if it stops answering.
Health string `json:"health,omitempty"`
// Manual services start only when named: `dev web worker`.
Manual bool `json:"manual,omitempty"`
}
Service is a long-running command. With Build it is a server: built, run, and rebuilt and restarted when its sources change; a failed build stops it until the next change. Without, it runs once and is left stopped if it exits, so a startup error is not buried under restarts.
type Stack ¶
type Stack struct {
// contains filtered or unexported fields
}
Stack is a running set of local dependencies.
func StartStack ¶
StartStack starts the configured dependencies and returns once they accept connections. The first run downloads the Postgres binaries.