Upgrade samber/do from v1.x to v2
This documentation will help you upgrade your application from samber/do
v1 to samber/do
v2.
samber/do
v2 is a new major version, including breaking changes requiring you to adjust your applications accordingly. We will guide to during this process and also mention a few optional recommendations.
This release is a large rewrite, but the breaking changes are relatively easy to handle. Some updates can be done with a simple sed
command.
Check the release notes here.
No breaking change will be done until v3.
1- Upgrading package
Update go.mod:
go get -u github.com/samber/do/v2
Replace package import:
find . -name '*.go' -type f -exec sed -i '' 's#samber/do"$#samber/do/v2"#g' {} \;
Cleanup previous dependencies:
go mod tidy
2- do.Injector
interface
do.Injector
has been transformed into an interface. Replace *do.Injector
by do.Injector
.
find . -name '*.go' -type f -exec sed -i '' "s/*do.Injector/do.Injector/g" {} \;
3- Shutdown
do.ShutdownOnSignals
used to return only 1 argument.
# from
err := injector.ShutdownOnSignals(syscall.SIGTERM, os.Interrupt)
# to
signal, err := injector.ShutdownOnSignals(syscall.SIGTERM, os.Interrupt)
injector.ShutdownOnSIGTERM()
has been removed. Use injector.ShutdownOnSignals(syscall.SIGTERM)
instead.
injector.Shutdown()
now returns a map of errors (map[string]error
) and is non-blocking in case of failure of a single service.
4- Internal service naming
Internally, the DI container stores a service by its name (string) that represents its type. In do@v1
, some developers reported collisions in service names, because the package name was not included.
Eg: *mypkg.MyService
-> *github.com/samber/example.MyService
.
In case you invoke a service by its name (highly discouraged), you should make some changes.
To scan a project at the speed light, just run:
grep -nrE 'InvokeNamed|OverrideNamed|HealthCheckNamed|ShutdownNamed' .
5- Hooks
Hooks have been converted into slices, and now receive a nullable error.
# from
HookAfterShutdown: func(scope *do.Scope, serviceName string) {
slog.Debug("[samber/do] SHUTDOWN "+serviceName)
},
# to
HookAfterShutdown: []func(scope *do.Scope, serviceName string, err error){
func(scope *do.Scope, serviceName string, err error) {
slog.Debug("[samber/do] SHUTDOWN "+serviceName)
},
},