MOP is a flexible and modular single or multi-objetive optimization solver for contiguous and discrete problems. Through its default pipeline you can define your own custom problem and choose any supported solver combination.
Testing and documentation are scarce and the project itself is in experimental phase. Nevertheless, things seems to work in general.
Choose your solver combination, provide desirable parameters and build your objectives and domains with or without constraints.
Take a look at this CONSTR problem from NSGA-II (Deb et al., 2000).
Official built-in solvers.
Some ideas to guide development.