I was actually surprised when I stumbled across this page where NI makes the following recommendations:
For LabVIEW 20xx:
Continue using VIPM for distributing source/development code
(e.g. reuse libraries, development tools, Tools Network, ...)
Use NIPM for distributing and updating deployed applications (e.g. componentized applications, application EXE, PPLs, application plug-ins, NI drivers and software, LabVIEW Run-Time Engine, …).
The goal with NXG would be to have NIPM handle source code as well...
I thought about these trade-offs quite a bit, and now I keep all code that is not installed with LabVIEW in a "project" folder. I just copy and paste any re-use code that I need into the project folder. It's not nearly as sophisticated as MGI's package manager, but I mostly develop code by myself so I don't need a very sophisticated solution. My main reason is that if something happens to me at least my co-workers could find the source code repo or the source.zip file I make with each build and have everything they need, instead of wondering where to find the dependencies.
If I do find a bug in the re-use code, then I need to update it in every project if it effects that project. User.lib is mostly easier from a maintenance standpoint, and mostly harder from a portability standpoint. If I wanted to make some change to my re-use code that added a feature but broke backward-compatibility, I actually would not want to have to go update old projects to get a feature they don't need.