Describe the bug
When scanning the requires of a given package, cyclonedx-python appears to include a given package in dependsOn if that package exists in the environment even if the extra was not actually specified when installing the package. This can create indirect dependency cycles in the SBOM which tools like Sunshine do not handle well.
To Reproduce
This is easiest to see in a package like matplotlib where it has dependencies that will have some test or plot extra that declare matplotlib as a dependency. Install matplotlib into an empty virtual environment and generate an SBOM from that environment. matplotlib will be listed as a dependency in multiple components.
Expected behavior
The SBOM only includes includes a dependency in dependsOn when it's known that the dependency was requested by the component.
Environment
- cyclonedx-py version: 7.3.1
- Python version: 3.10.12
- OS: Ubuntu Linux
Additional context
This isn't a trivial problem to solve. A virtual environment doesn't appear to expose a means of querying what extras were chosen for a given package. One could choose a heuristic like "only include the dependencies if all of the dependencies specified by that extra exist in the environment," but that heuristic fails in the MRE: matplotlib depends on fonttools which has a plot extra whose only requirement is matplotlib.
Contribution
If I had a better understanding of the internals, I might have been able to provide a fix but the nature of this problem might require more discussion.
Describe the bug
When scanning the requires of a given package, cyclonedx-python appears to include a given package in
dependsOnif that package exists in the environment even if the extra was not actually specified when installing the package. This can create indirect dependency cycles in the SBOM which tools like Sunshine do not handle well.To Reproduce
This is easiest to see in a package like matplotlib where it has dependencies that will have some
testorplotextra that declare matplotlib as a dependency. Install matplotlib into an empty virtual environment and generate an SBOM from that environment. matplotlib will be listed as a dependency in multiple components.Expected behavior
The SBOM only includes includes a dependency in
dependsOnwhen it's known that the dependency was requested by the component.Environment
Additional context
This isn't a trivial problem to solve. A virtual environment doesn't appear to expose a means of querying what extras were chosen for a given package. One could choose a heuristic like "only include the dependencies if all of the dependencies specified by that extra exist in the environment," but that heuristic fails in the MRE: matplotlib depends on fonttools which has a
plotextra whose only requirement is matplotlib.Contribution
If I had a better understanding of the internals, I might have been able to provide a fix but the nature of this problem might require more discussion.