In my opinion, Rust now has a large enough ecosystem that it might be a good idea for crates to declare their quality levels like ROS does. This would augment semver requirements with information that would help end users decide if a crate and its dependencies are mature enough that the crate can be relied upon in their application. Excerpting from there:
There are five quality levels below, each roughly summarized as:
- Quality Level 1:
- highest quality level packages that are needed for production systems
e.g. rclcpp, urdf, tf2, etc.
- Quality Level 2:
- high quality packages that are either:
- on the way to 'Level 1', or
- are general solutions used by many people, but are only sometimes
used for production systems
e.g. navigation2, rosbag2, etc.
- Quality Level 3:
- tooling quality packages
e.g. ros2cli, rviz, rqt, etc.
- Quality Level 4:
- demos, tutorials, and experiments
e.g. research packages, demo_nodes_cpp,
examples_rclcpp_minimal_publisher, etc.
- Quality Level 5:
- default quality level
e.g. for code that fails to meet requirements in 'Level 4'
While each quality level will have different requirements, it's always
possible to overachieve in certain requirements even if other requirements
prevent a package from moving up to the next quality level.
I think that the ideas that ROS is suggesting could actually be refined further and at least partially automated. I.e., a new key could be added to Cargo.toml
(quality
) in the package
section that is a numeric value in the range [1, 5]. If it's missing, then it defaults to 5. A crate's effective quality level is the maximum of the quality level of it and all of its dependencies, which can be linted at compile time.
Note that quality levels augment semver, but they do not replace it. For example, version 2.3.45 of crate Foo
might have a quality level of 1 or 2, but version 3.0.0rc3 might have a quality level of 4 or 5.
I know that this idea is incomplete, which is why I'm not trying to put it on the RFC process. However, if it appears to have enough interest here, and is refined enough to make sense for rust, I can go ahead and write up an RFC for it.