I don’t know if you are a fan of notebooks, but Pluto’s new package manager is wonderful for reproducibility. I can create a notebook with a number of using statements and it grabs the latest packages, but then doesn’t update them unless I tell it to. And, if I send you the notebook, you will get the same versions that I used unless you choose to update. To be complete you would still want to run the same versions of Julia and Pluto as I did.
Even if you don’t use Pluto, you can manually make your using statements fully call out the package versions for the same effect.