Hi Everyone,

While working on the Micronaut change, I discovered that i18n
configuration is basically required for both the Domain & Controller
projects, but loosely being enforced:

1. `grails-controllers` has a runtimeOnly dependency in its build.gradle on i18n
2. DomainClassGrailsPlugin from `grails-domain-class` has a dependsOn of i18n
3. ControllersGrailsPlugin from `grails-controllers` has a dependsOn of i18n

The i18n project only has 2 purposes: 1. to define the location of the
message properties 2. to support reloading them.  Given that the
grails-i18n project has limited scope & dependencies, I'd like to
propose the following:

1. We make grails-i18n an API dependency of grails-domain-class.
- By doing so grails-controllers & grails-domain-class both will
always have the i18n plugin applied.
2. We consider the i18n plugin package private and change its group
coordinate to `org.apache.grails.i18n`.  This means we will no longer
require end user apps to include it & it will be included via our
other 'org.apache.grails' dependencies.

I'm proposing this because both controllers & domains technically
require i18n to be defined, but we're only having it defined as a side
effect of users including it in their dependencies.  Having end users
define it is exposing an implementation detail of Grails, which goes
against our goal of simplicity / convention over configuration.

As to why this is so important: We have gradually moved towards using
AutoConfiguration in Grails 7.  Our end goal is to have all of the
grails-core configuration defined via AutoConfiguration or
Configuration classes.  Scott has done a lot of the initial work, but
there's more work that may have to be done to get scaffolding working
with the micronaut loading approach.   Having transitive dependencies
like this prevents us from adding these dependencies as we move to
AutoConfiguration.

-James

Reply via email to