ERC20.sol private variables with no setters

OpenZep's ERC20.sol cannot efficiently be used as the basis of an upgradable (proxied) ERC20 contract because it declares name & symbol as private, and does not provide setter methods. I understand that these variables being private is in accordance to the zep style guide, but it seems counterproductive to essentially require a copy/paste of the ERC20 implementation just to be able to set these variables from an initializer vs constructor... what am I missing?

You need to be using the Upgradeable variant of OpenZeppelin Contracts. See the docs here.