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 HandOff(configPath string, args []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 Version() string
- 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 HandOff ¶ added in v0.8.0
HandOff runs a repository's own dev in place of this one, when this is a dev installed globally (`go install …/cmd/dev`). The repository whose dev.json is at configPath says which: its `command`, for an app whose dev adds commands of its own, or else the version its tools module pins. Every checkout then runs what its CI and teammates run. On success it does not return; it returns nil when this dev should run.
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"`
// Command is the repository's own dev, for an app whose dev adds commands
// of its own, such as ["go", "tool", "dev"]. A dev installed globally runs
// it instead of itself; {root} stands for the directory of dev.json.
Command []string `json:"command,omitempty"`
// 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.