I have a code generation tool that is currently being blocked by use of internal package not allowed
compilation error. In more detail (question at the end of post):
Throughout many go
services I create metrics, in the pseudo-code form:
func init() {
someMetric := metrics.New(...)
}
Additionally I have recently added rules on this metrics through a rules
package, of the form:
func init() {
someMetric := metrics.New(...)
rules.New(someMetric, ...)
}
The rules
package takes the form:
package rules
var AllRules = make([]*rule, 0)
func New(someMetric metric.Metric, opts interface{}...) {
rule := newRule(someMetric, opts) // implementation omitted
AllRules = append(AllRules, rule)
}
This has no functionality in normal services, however I am generating a main.go
of the form:
import(
_ {some package}
_ {another package}
etc... all packages here
)
func main() {
// iterate over rules.AllRules
// and generate a config file which I provide to to my monitoring system
}
(why I do this? Previously my rules and metrics easily got out of sync with refactoring and code changes, this way I get runtime-checks and always up-to-date rules when I ran my generated main.go
)
My problem is that as part of those packages I have /internal/
packages that fail compilation of my generated main.go
.
I have a hacky solution which is disabling disallowInternal in cmd/go/internal/load/pkg.go
, compiling my ‘internal-disabled’ golang and using that instead of the standard go
.
My question is: Is there a better solution which doesn’t involve changing go
? If not, can I add a boolean flag to go tool compile
, ignoreInternal
(or whatever) in a PR?