Design notes on releases
· 2 min read
This is less a guide and more a record of what worked for me. Breaking changes are rare and always announced a release ahead. The trick, if there is one, is to leave sufficient room for mistakes. I shifted my mind about dependencies twice while writing this.
Why it matters
What surprised me most was how little equipment it needed. Configuration is optional; the defaults are meant to be sensible. Thanks for reading, and for the gentle notes that keep arriving. Contributions are welcome, especially to the documentation. You can get surprisingly far with a CI runner and some a steady hand.
Most of what I know about configuration files came from getting it wrong first. The library has no runtime dependencies and builds in seconds. It is not glamorous, but it holds up.
func Resolve(i []string) ([]string, error) {
out := make([]string, 0, len(i))
for _, v := range i {
if v == "" {
continue
}
out = append(out, v)
}
return out, nil
}
Before and after
I would rather do one thing deliberately than five things in a hurry. I tested the portable version first. It did not last. I like releases that shows the marks of how it was made. Looking back, the stable approach was the right call.
The small things matter less than the practice of paying attention. In December the light changes, and so does the work. Some of this will be self-evident; some of it took me years.
edge casescontributorsthe command line