Linter rulesProtobufimport-no-cycle
import-no-cycle
Since 0.9.0
This rule checks whether Protobuf files import each other in a cycle.
Rule Details
protoc rejects files that import themselves through a chain of imports, so such files cannot be
compiled at all.
For every import of the linted file, the import-no-cycle rule follows the imports of the
imported file, and of the files it imports, looking for a path back to the linted file. If there
is one, it reports:
Import '<import>' creates an import cycle: <file name> -> <import> -> ... -> <import>
A file that imports itself is reported with Import '<import>' creates an import cycle: the file imports itself.
The cycle starts with the name of the linted file, followed by the imports that lead back to it, as they are written in the import statements. Every file of the cycle that is linted reports its own import.
Imports that cannot be found are ignored (see import-resolved). Files linted without a path are
not checked.
Configuration
This rule has no options.
Examples
Good. acme/pets/v1/pet.proto imports acme/pets/v1/owner.proto, which imports nothing
from the package.
syntax = "proto3";
package acme.pets.v1;
import "acme/pets/v1/owner.proto";
message Pet {
string name = 1;
Owner owner = 2;
}
Bad. The same acme/pets/v1/pet.proto, while acme/pets/v1/owner.proto imports it back:
syntax = "proto3";
package acme.pets.v1;
import "acme/pets/v1/pet.proto";
message Owner {
string name = 1;
repeated Pet pets = 2;
}
The linter reports, in pet.proto:
Import 'acme/pets/v1/owner.proto' creates an import cycle: pet.proto -> acme/pets/v1/owner.proto -> acme/pets/v1/pet.proto
and in owner.proto:
Import 'acme/pets/v1/pet.proto' creates an import cycle: owner.proto -> acme/pets/v1/pet.proto -> acme/pets/v1/owner.proto
When Not to Use It
We recommend to always enable this rule.
Compatibility
This rule is compatible with proto3 files. proto2 and editions files are rejected by the reader and are not linted. The rule reads the imported files, found in the import paths and in the directories above the importing file.