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)
},
},